2016-11-30 2 views
0

J'essaye d'écrire un code qui exécute plusieurs produits de points vectoriels à l'intérieur du noyau. J'utilise cublasSdot fonction de bibliothèque de cublas pour effectuer le produit de point de vecteur. Ceci est mon code:Message "device-function-maxrregcount" lors de la compilation du code cuda

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; 
} 

J'ai inclus bibliothèque cublas_v2 et utilisé la commande suivante pour compiler le code:

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

Mais je reçu le message suivant:

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

Quelqu'un peut-il S'il vous plaît laissez-moi savoir ce que je devrais faire concernant ce message?

+3

. c'est juste informationnel AFAIK – talonmies

Répondre

3

Ce message est informatif, comme dit par talonmies.

Cette option maxregcount de FPUNV est utilisé pour spécifier une limite de registres qui peuvent être utilisés par un noyau et toutes les fonctions de l'appareil qu'il utilise:

Si un noyau est limité à un certain nombre de registres avec l'attribut launch_bounds ou l'option --maxrregcount, alors toutes les fonctions que les appels du noyau ne doivent pas utiliser plus que ce nombre de registres; Si elles dépassent la limite, une erreur de lien sera donnée.

Voir: NVCC Doc : 6.5.1. Object Compatibility

Il semble que le dispositif-fonction maxregcount est utilisée pour remplacer cette valeur que pour les fonctions de l'appareil. Ainsi, vous pouvez avoir une quantité maximale différente de registres autorisés sur les noyaux et les fonctions de l'appareil.

Pour les fonctions de périphérique, cette option remplace la valeur spécifiée par --maxregcount.

Source: The CUDA Handbook

rien