Advertisement
Guest User

Untitled

a guest
Jan 14th, 2014
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #define PRINTERROR(err) {if(err != cudaSuccess) printf("CUDA ERROR IN LINE %d OF FILE %s: %s (%d)\n", __LINE__, __FILE__, cudaGetErrorString(err), (int)err);}
  2. #define SAFECALL(fun) {cudaError_t err = fun; PRINTERROR(err);}
  3. #define SAFECALL_KERNEL(fun) {(fun); cudaError_t err = cudaGetLastError(); PRINTERROR(err);}
  4.  
  5. float *ADev, *BDev, *CDev;
  6. float *AHost, *BHost, *CHost;
  7. float** matricesHost[3] = {&AHost, &BHost, &CHost};
  8. float** matricesDevice[3] = {&ADev, &BDev, &CDev};
  9. void initHostMatrices (float*** f, int matrixSize)
  10. {
  11.  
  12.     for (int i = 0; i < 3; i++)
  13.     {
  14.         *(*(f+i)) = (float*)malloc(matrixSize*matrixSize*sizeof(float));
  15.     }
  16.     for (int i = 0; i < matrixSize*matrixSize; i++)
  17.     {
  18.         float* A = *(*f);
  19.         float* B = *(*(f+1));
  20.         *(A + i) = ((float)rand())/RAND_MAX;
  21.         *(B + i) = ((float)rand())/RAND_MAX;       
  22.     }
  23. }
  24.  
  25. void freeHostMatrices (float*** f)
  26. {
  27.     for (int i = 0; i < 3; i++) free(*f[i]);
  28. }
  29.  
  30. void initDeviceMatrices (float*** f, int matrixSize)
  31. {
  32.     for (int i = 0; i < 3; i++)
  33.     {
  34.         SAFECALL(cudaMalloc(*(f+i), matrixSize*matrixSize*sizeof(float)));
  35.     }
  36. }
  37.  
  38. void freeDeviceMatrices (float*** f)
  39. {
  40.     for (int i = 0; i < 3; i++) SAFECALL(cudaFree(*f[i]));
  41. }
  42.  
  43. void matrixVerification(int matrixSize)
  44. {
  45.     float* CVerify = (float*)malloc(matrixSize*matrixSize*sizeof(float));
  46.     for (int i = 0; i < matrixSize; i++)
  47.         for (int j = 0; j < matrixSize; j++)
  48.         {
  49.             CVerify[i*matrixSize + j] = 0;
  50.             for (int k = 0; k < matrixSize; k++)
  51.                 CVerify[i*matrixSize + j] += AHost[i*matrixSize + k]*BHost[k*matrixSize + j];
  52.         }
  53.     for (int i = 0; i < matrixSize; i++)
  54.     {
  55.         for (int j = 0; j < matrixSize; j++)
  56.         {
  57.             printf("%s ",( CVerify[i*matrixSize + j] - CHost[i*matrixSize + j] < 0.001)?"P":"F");
  58.         }
  59.         printf("\n");
  60.     }
  61.     system("pause");
  62. }
  63.  
  64. int main()
  65. {
  66.     srand((unsigned int)time(NULL));   
  67.     SAFECALL(cudaSetDevice(0));
  68.     int matrixSize = 7;
  69.     {
  70.         initHostMatrices(matricesHost, matrixSize);
  71.         initDeviceMatrices(matricesDevice, matrixSize);
  72.         SAFECALL(cudaMemcpy(ADev, AHost, matrixSize*matrixSize*sizeof(float), cudaMemcpyHostToDevice));
  73.         SAFECALL(cudaMemcpy(BDev, BHost, matrixSize*matrixSize*sizeof(float), cudaMemcpyHostToDevice));
  74.         dim3 numBlocks(2, 2);
  75.         dim3 numThreads(2, 2);
  76.         SAFECALL_KERNEL((cuMultiplyMatricesStandard<<<numBlocks, numThreads>>>(ADev, BDev, CDev, matrixSize)));    
  77.         SAFECALL(cudaMemcpy(CHost, CDev, matrixSize*matrixSize*sizeof(float), cudaMemcpyDeviceToHost));    
  78.         matrixVerification(matrixSize);
  79.         freeHostMatrices(matricesHost);
  80.         freeDeviceMatrices(matricesDevice);
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement