2016-11-30 47 views
0

我正在嘗試編寫一個在內核中執行多個向量點積的代碼。我正在使用cublasSdot功能從cublas庫執行矢量點產品。這是我的代碼:編譯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; 
} 

我已經包括cublas_v2庫,並使用下面的命令來編譯代碼:

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