Умножение матриц с помощью cublasSgemm

Имею простейшую программу перемножения матриц, использующую функцию cublasSgemm библиотеки CUBLAS:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <sys/time.h>
  5. #include <cublas.h>
  6.  
  7.  
  8. int main ( int argc, char** argv ) {
  9.  
  10.  int i;
  11.  
  12.  cublasStatus status;
  13.  
  14.  struct timeval timev1,timev2;
  15.  float time_seconds;
  16.  
  17.  int N = atoi ( argv [ 1 ] );
  18.  printf ( "N = %d\n", N );
  19.  
  20.  float *A ,* B, *C;
  21.  float *d_A, *d_B, *d_C;
  22.  
  23.  A = (float*) malloc ( N * N * sizeof ( float ) );
  24.  B = (float*) malloc ( N * N * sizeof ( float ) );
  25.  C = (float*) malloc ( N * N * sizeof ( float ) );
  26.  
  27.  for ( i = 0; i < N * N; i++ ) {
  28.   A [ i ] = 0.1;
  29.   B [ i ] = 0.2;
  30.   C [ i ] = 0.0;
  31.  }
  32.  
  33.  cublasInit();
  34.  
  35.  status = cublasAlloc ( N * N, sizeof(float), (void**)&d_A);
  36.  status = cublasAlloc ( N * N, sizeof(float), (void**)&d_B);
  37.  status = cublasAlloc ( N * N, sizeof(float), (void**)&d_C);
  38.  
  39.  cublasSetMatrix ( N, N, sizeof(float), (void *) A, N, (void *) d_A, N);
  40.  cublasSetMatrix ( N, N, sizeof(float), (void *) B, N, (void *) d_B, N);
  41.  
  42.  gettimeofday(&timev1,NULL);
  43.  
  44.  cublasSgemm ( 'n', 'n', N, N, N, 1.0f, d_A, N, d_B, N, 1.0f, d_C, N );
  45.  cublasGetMatrix ( N, N, sizeof(float), (void *) d_C, N, (void *) C, N );
  46.  
  47.  gettimeofday(&timev2,NULL);
  48.  time_seconds=timev2.tv_sec-timev1.tv_sec+0.000001*(timev2.tv_usec-timev1.tv_usec);
  49.  
  50.  cublasFree (d_A);
  51.  cublasFree (d_B);
  52.  cublasFree (d_C);
  53.  
  54.  cublasShutdown();
  55.  
  56.  printf("Elapsed time = %.4f\n",time_seconds);
  57.  printf ( "C[0,0]=%f\n", C[0] );
  58.  
  59. }

Транслирую обычным образом:

bash-3.2$ make
g++ -O3 -I/usr/local/cuda/include -c main.cpp
g++ -L/usr/local/cuda/lib64 -lcublas -o MatMul main.o

Однако, когда запускаю программу на счет, повторные запуски дают разные результаты,
причем видно, что к результату предыдущего запуска всё время добавляется число ~ 20 -
правильный ответ умножения.

bash-3.2$ make
g++ -O3 -I/usr/local/cuda/include -c main.cpp
g++ -L/usr/local/cuda/lib64 -lcublas -o MatMul main.o
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0081
C[0,0]=61.626236
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0082
C[0,0]=82.106514
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0079
C[0,0]=102.586792
make-3.2$
g++ -O3 -I/usr/local/cuda/include -c main.cpp
g++ -L/usr/local/cuda/lib64 -lcublas -o MatMul main.o
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0081
C[0,0]=123.067070
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0078
C[0,0]=143.547348
bash-3.2$ ./MatMul 1024
N = 1024
Elapsed time = 0.0079
C[0,0]=164.027618

В чем здесь дело ?

Forums: 

Проблему разрешил - в

Проблему разрешил - в программе не хватало оператора

cublasSetMatrix ( N, N, sizeof(float), (void *) C, N, (void *) d_C, N);