2016-08-17 1 views
0

J'essaie d'écrire un exemple simple de multiplication matricielle en utilisant la fonction cBLas cBLas cgemMas. Mon code est illustré ci-dessous:Quelle est la raison de la multiplication échoue de la matrice en utilisant cublasSgemm dans ce code?

int m =100, n = 100; 
float * bold1 = new float [m*n]; 
float * bold2 = new float [m*n]; 
float * bold3 = new float [m*n]; 
for (int i = 0; i< m; i++) 
     for(int j = 0; j <n;j++) 
       { 
         bold1[i*n+j]=rand()%10; 
         bold2[i*n+j]=rand()%10; 
       } 

cudaError_t cudaStat; 
cublasStatus_t stat; 
cublasHandle_t handle; 

const float alpha = 1.0; 
const float beta = 0; 

float * dev_bold1, * dev_bold2, *dev_bold3; 
cudaStat = cudaMalloc ((void**)&bold1, sizeof(float)*m*n); 
if(cudaStat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem1"; 
     return cudaStat; 
     } 
cudaStat = cudaMalloc ((void**)&bold2,sizeof(float)*m*n); 
if(cudaStat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem2"; 
     return cudaStat; 
     } 

cudaStat = cudaMalloc ((void**)&bold3,sizeof(float)*m*n); 
if(cudaStat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem3"; 
     return cudaStat; 
     } 

cublasSetMatrix(m,n,sizeof(float),bold1,m,dev_bold1,m); 
cublasSetMatrix(m,n,sizeof(float),bold2,m,dev_bold2,m); 

stat = cublasCreate(&handle); 
if(stat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem4"; 
     return stat; 
     } 
cout<<stat<<"  "<<CUBLAS_STATUS_SUCCESS<<"\n"; 
stat = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, m, n ,&alpha, dev_bold1, n, dev_bold2, n, &beta,dev_bold3,m); 

if (stat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem5"; 
     return stat; 
     } 
cudaStat = cudaMemcpy(bold3,dev_bold3,sizeof(float)*m*n,cudaMemcpyDeviceToHost); 
if (cudaStat != cudaSuccess) 
     { 
     cout<<"problem6"; 
     return cudaStat; 
     } 

delete []bold1; 
delete []bold2; 
cudaFree(dev_bold1); 
cudaFree(dev_bold2); 
cudaFree(dev_bold3); 

Dans ce code, je veux multiplier à matrices bold1 et Bold2 qui sont remplis avec des nombres aléatoires. Le « problème 5 » retour de code qui est lié à cette partie du code:

stat = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, m, n ,&alpha, dev_bold1, n, dev_bold2, n, &beta,dev_bold3,m); 

    if (stat != CUBLAS_STATUS_SUCCESS) 
      { 
      cout<<"problem5"; 
      return stat; 
      } 

J'ai aussi l'impression stat et il affiche « 13 »!

Quelqu'un peut-il m'aider s'il vous plaît à comprendre quel est le problème avec mon code? Merci!

Répondre

1

L'erreur principale est dans vos cudaMalloc déclarations, vous allouez le mauvais pointeur:

float * dev_bold1, * dev_bold2, *dev_bold3; 
cudaStat = cudaMalloc ((void**)&bold1, sizeof(float)*m*n); 
           ^
           | 
          this should be dev_bold1 

et de même pour les 2 autres cudaMalloc déclarations.

Le code suivant a ces erreurs fixes et renvoie aucune erreur d'exécution:

$ cat t1235.cu 

#include <cublas_v2.h> 
#include <iostream> 

using namespace std; 

int main(){ 

int m =100, n = 100; 
float * bold1 = new float [m*n]; 
float * bold2 = new float [m*n]; 
float * bold3 = new float [m*n]; 
for (int i = 0; i< m; i++) 
     for(int j = 0; j <n;j++) 
       { 
         bold1[i*n+j]=rand()%10; 
         bold2[i*n+j]=rand()%10; 
       } 

cudaError_t cudaStat; 
cublasStatus_t stat; 
cublasHandle_t handle; 

const float alpha = 1.0; 
const float beta = 0; 

float * dev_bold1, * dev_bold2, *dev_bold3; 
cudaStat = cudaMalloc ((void**)&dev_bold1, sizeof(float)*m*n); 
if(cudaStat != cudaSuccess) 
     { 
     cout<<"problem1"; 
     return cudaStat; 
     } 
cudaStat = cudaMalloc ((void**)&dev_bold2,sizeof(float)*m*n); 
if(cudaStat != cudaSuccess) 
     { 
     cout<<"problem2"; 
     return cudaStat; 
     } 

cudaStat = cudaMalloc ((void**)&dev_bold3,sizeof(float)*m*n); 
if(cudaStat != cudaSuccess) 
     { 
     cout<<"problem3"; 
     return cudaStat; 
     } 

cublasSetMatrix(m,n,sizeof(float),bold1,m,dev_bold1,m); 
cublasSetMatrix(m,n,sizeof(float),bold2,m,dev_bold2,m); 

stat = cublasCreate(&handle); 
if(stat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem4"; 
     return stat; 
     } 
cout<<stat<<"  "<<CUBLAS_STATUS_SUCCESS<<"\n"; 
stat = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, m, n ,&alpha, dev_bold1, n, dev_bold2, n, &beta,dev_bold3,m); 

if (stat != CUBLAS_STATUS_SUCCESS) 
     { 
     cout<<"problem5"; 
     return stat; 
     } 
cudaStat = cudaMemcpy(bold3,dev_bold3,sizeof(float)*m*n,cudaMemcpyDeviceToHost); 
if (cudaStat != cudaSuccess) 
     { 
     cout<<"problem6"; 
     return cudaStat; 
     } 

delete []bold1; 
delete []bold2; 
cudaFree(dev_bold1); 
cudaFree(dev_bold2); 
cudaFree(dev_bold3); 

return 0; 
} 
$ nvcc -o t1235 t1235.cu -lcublas 
$ cuda-memcheck ./t1235 
========= CUDA-MEMCHECK 
0  0 
========= ERROR SUMMARY: 0 errors 
$ 

J'ai aussi changé quelques de vos déclarations de vérification des erreurs où vous vérifiaient les valeurs de retour d'erreur cuda contre les types d'erreur de cublas.