Advertisement
elsemTim

cuBLAS

Dec 22nd, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <cuda_runtime.h>
  5. #include "cublas_v2.h"
  6. #define M 6
  7. #define N 5
  8. #define IDX2F(i,j,ld) ((((j)-1)*(ld))+((i)-1))
  9.  
  10. //перемножение
  11. static __inline__ void modify (cublasHandle_t handle, float *m, int ldm, int n, int p, int q, float alpha, float beta){
  12.     cublasSscal (handle, n-q+1, &alpha, &m[IDX2F(p,q,ldm)], ldm);
  13.     cublasSscal (handle, ldm-p+1, &beta, &m[IDX2F(p,q,ldm)], 1);
  14. }
  15.  
  16. int main (void){
  17.     cudaError_t cudaStat;    
  18.     cublasStatus_t stat;
  19.     cublasHandle_t handle;
  20.     int i, j;
  21.     float* devPtrA;
  22.     float* a = 0;
  23.  
  24.     //выделение памяти
  25.     a = (float *)malloc (M * N * sizeof (*a));
  26.     if (!a) {
  27.         printf ("host memory allocation failed");
  28.         return EXIT_FAILURE;
  29.     }
  30.  
  31.     //заполнение матрицы
  32.     for (j = 1; j <= N; j++) {
  33.         for (i = 1; i <= M; i++) {
  34.             a[IDX2F(i,j,M)] = (float)((i-1) * M + j);
  35.         }
  36.     }
  37.  
  38.     //проверка на то что на девайсе выделили память
  39.     cudaStat = cudaMalloc ((void**)&devPtrA, M*N*sizeof(*a));
  40.     if (cudaStat != cudaSuccess) {
  41.         printf ("device memory allocation failed");
  42.         return EXIT_FAILURE;
  43.     }
  44.  
  45.     //проверка на то что инизиализация массива не провалена
  46.     stat = cublasCreate(&handle);
  47.     if (stat != CUBLAS_STATUS_SUCCESS) {
  48.         printf ("CUBLAS initialization failed\n");
  49.         return EXIT_FAILURE;
  50.     }
  51.  
  52.     //проверка на то что мы передали данные в GPU
  53.     stat = cublasSetMatrix (M, N, sizeof(*a), a, M, devPtrA, M);
  54.     if (stat != CUBLAS_STATUS_SUCCESS) {
  55.         printf ("data download failed");
  56.         cudaFree (devPtrA);
  57.         cublasDestroy(handle);
  58.         return EXIT_FAILURE;
  59.     }
  60.  
  61.     //
  62.     modify (handle, devPtrA, M, N, 2, 3, 16.0f, 12.0f);
  63.  
  64.     //копирование с GPU на CPU в массив A
  65.     stat = cublasGetMatrix (M, N, sizeof(*a), devPtrA, M, a, M);
  66.  
  67.     //возвращение данных
  68.     if (stat != CUBLAS_STATUS_SUCCESS) {
  69.         printf ("data upload failed");
  70.         cudaFree (devPtrA);
  71.         cublasDestroy(handle);        
  72.         return EXIT_FAILURE;
  73.     }
  74.  
  75.     //освобождение ресурсов
  76.     cudaFree (devPtrA);
  77.     cublasDestroy(handle);
  78.  
  79.     //вывод матрицы
  80.     for (j = 1; j <= N; j++) {
  81.         for (i = 1; i <= M; i++) {
  82.             printf ("%7.0f", a[IDX2F(i,j,M)]);
  83.         }
  84.         printf ("\n");
  85.     }
  86.  
  87.     //освобождение памяти на CPU
  88.     free(a);
  89.     return EXIT_SUCCESS;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement