2016-11-30 5 views
0

커널 내부에 여러 개의 벡터 내적을 수행하는 코드를 작성하려고합니다. 나는 cublasSdot 함수를 사용하여 cublas 벡터 점 제품을 수행하는 라이브러리에서 사용하고 있습니다. 내가 cublas_v2 라이브러리를 포함하고 코드를 컴파일하려면 다음 명령을 사용했습니다cuda 코드를 컴파일하는 중 "device-function-maxrregcount"메시지가 발생했습니다.

using namespace std; 
__global__ void ker(float * a, float * c,long long result_size,int n, int m) 
{ 
float *sum; 
int id = blockIdx.x*blockDim.x+threadIdx.x; 
float *out1,*out2; 
int k; 

if(id<result_size) 
     { 
       cublasHandle_t handle; 
       cublasCreate(&handle); 
       out1 = a + id*m; 
       for(k=0;k<n;k++) 
       { 
         out2 =a + k*m; 
         cublasSdot(handle, m,out1,1,out2,1,sum); 
         c[id*n + k]= *sum; 
       } 
     } 
} 
int main() 
{ 
int n=70000,m=100; 
long result_size=n; 
result_size*=n; 
float * dev_data,*dev_result; 
float * data = new float [n*m]; 
float * result = new float [result_size]; 
for (int i = 0; i< n; i++) 
     for(int j = 0; j <m;j++) 
     { 
      data[i*m+j]=rand(); 
     } 

cudaMalloc ((void**)&dev_data,sizeof(float)*m*n); 
cudaMalloc ((void**)&dev_result,sizeof(float)*result_size); 
cudaMemcpy(dev_data, data, sizeof(float) * m* n, cudaMemcpyHostToDevice); 
int block_size=1024; 
int grid_size=ceil((float)result_size/(float)block_size); 
ker<<<grid_size,block_size>>>(dev_data,dev_result,result_size,n,m); 
cudaDeviceSynchronize(); 
cudaMemcpy(result, dev_result, sizeof(float)*(result_size), cudaMemcpyDeviceToHost); 
return 0; 
} 

: 이것은 내 코드입니다

nvcc -lcublas_device -arch=sm_35 -rdc=true askstack.cu -o askstack 

을하지만 다음과 같은 메시지가 있어요 :

ptxas info : 'device-function-maxrregcount' is a BETA feature 

사람이 수를 이 메시지에 관해 내가 어떻게해야하는지 알려주세요.

+3

아무것도. 정보 제공 용 AFAIK입니다. – talonmies

답변

3

이 메시지는 talonmies가 말한 것처럼 정보 용입니다. 커널은 레지스터들의 특정 개수에 한정되는

경우

NVCC이 maxregcount 옵션은 커널에 의해 사용되는 모든 장치 기능이 이용 될 수있는 레지스터의 제한을 지정하는 데 사용 launch_bounds 속성 또는 --maxrregcount 옵션을 사용하면 커널이 호출하는 모든 함수가 그 수보다 많은 수의 레지스터를 사용해서는 안됩니다. 제한을 초과하면 링크 오류가 발생합니다.

참조 : NVCC Doc : 6.5.1. Object Compatibility

그것은 해당 장치 기능-maxregcount 장치의 기능에만이 값을 대체 할 것 같다. 따라서 커널 및 장치 기능에 허용되는 레지스터의 최대 크기를 다르게 지정할 수 있습니다.

장치 기능의 경우이 옵션은 --maxregcount에 지정된 값보다 우선합니다.

출처 : The CUDA Handbook