Синхронизация процессора и GPU

Люди, помогите пожалуйста, я новичек в cuda - проблема в том, что не выполняется синхронизация и соответственно не видно результатов вычислений. Программка должна перемножать 2 матрицыю Вот код:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. __global__ void matmult(float * m1, float * m2, float * r, int k, int n, int m)
  5. {
  6.         int Xr = threadIdx.x % m;
  7.         int Yr = threadIdx.x / m;
  8.         int Y1 = Yr, X2 = Xr;
  9.         r[threadIdx.x] = 0;
  10.         for (int i=0; i<n; ++i)
  11.                 r[threadIdx.x] += (n*Y1 + i) * (m*i + X2);
  12. }
  13.  
  14. #define k 3
  15. #define n 4
  16. #define m 2
  17.  
  18. void printMat(float *mat, int width, int height);
  19.  
  20. int main(int argc, char *args[])
  21. {
  22.         float a[k*n], b[n*m], c[k*m];
  23.         for (int i=0; i<k*n; ++i)
  24.                 a[i] = (double)rand() / (double)RAND_MAX * 10.0;
  25.         for (int i=0; i<m*n; ++i)
  26.                 b[i] = (double)rand() / (double)RAND_MAX * 10.0;
  27.  
  28.         float *a_d, *b_d, *c_d;
  29.         cudaMalloc((void**)&a_d, sizeof(float)*k*n);
  30.         cudaMalloc((void**)&b_d, sizeof(float)*m*n);
  31.         cudaMalloc((void**)&c_d, sizeof(float)*k*m);
  32.  
  33.         cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyDeviceToHost);
  34.         cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyDeviceToHost);
  35.  
  36.         matmult<<<1, k*m>>>(a_d, b_d, c_d, k, n, m);
  37.  
  38.         cudaThreadSynchronize();
  39.  
  40.         cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyHostToDevice);
  41.  
  42.         printMat(a, n, k);
  43.         printf("\n");
  44.         printMat(b, m, n);
  45.         printf("\n");
  46.         printMat(c, m, k);
  47.         printf("\n");
  48.  
  49.         cudaFree(a_d);
  50.         cudaFree(b_d);
  51.         cudaFree(c_d);
  52.  
  53.         return 0;
  54. }
  55.  
  56. void printMat(float *mat, int width, int height)
  57. {
  58.         for (int i=0; i<height; ++i)
  59.         {
  60.                 for (int j=0; j<width; ++j)
  61.                         printf("%.3f  ", mat[i*width+j]);
  62.                 printf("\n");
  63.         }
  64. }

Матрица после выполнения вычислений забита нулями.
Или может вовсе не в синхронизации дело?

PS: за качество кода сильно не пинайте

Forums: 

Я слышал, режим эмуляции

Я слышал, режим эмуляции отличается в некоторых моментах от реального и может показывать другие результаты.
И еще: киньте, плиз, какую-нибудь ссылочку на пример использования этой технологии (только не sdk)

HostToDevice перепутал

cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyDeviceToHost);
cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyDeviceToHost);
поменяй на
cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyHostToDevice);
cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyHostToDevice);
а
cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyHostToDevice);
на
cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyDeviceToHost);

Спасибо всем за помощь,

Спасибо всем за помощь, разобрался вроде.
Умудрился посадить ошибку еще в одном месте - вместо перемножения ячеек матрицы помножил их индексы. Ужость