Вычисление матрицы 2на2.

Программа вычисляет только первую строку. Помогите найти ошибку.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <vector>
  4. #include <conio.h>
  5. #define N (2)
  6. // вычисление умножения матрицы на матрицу
  7.  
  8. __global__ void mult( int *a, int *b, int *c) {
  9.     int bx = blockIdx.x;
  10.     int by = blockIdx.y;
  11.     int tx = threadIdx.x;
  12.     int ty = threadIdx.y;
  13.     float sum = 0.0;
  14.     int ia=N * 128 * by + N*  ty;
  15.     int ib=128 * bx + tx;
  16.     for (int k=0; k < N; k++)
  17.         sum += a[ia + k] * b[ib + k * N];
  18.     int ic = N * 128 * by + 128 * bx;
  19.     c[ic + N * ty + tx] = sum;
  20. }
  21. int main( void ) {
  22.     int *a,*b;
  23.     int *c;
  24.     a=(int *)malloc(N*N*sizeof(int));
  25.     b=(int *)malloc(N*N*sizeof(int));
  26.     c=(int *)malloc(N*N*sizeof(int));
  27.     int *dev_a, *dev_b;
  28.     int *dev_c;
  29.     cudaMalloc((void**) &dev_a, N*N*sizeof(int));
  30.     cudaMalloc((void**) &dev_b, N*N*sizeof(int));
  31.     cudaMalloc((void**) &dev_c, N*N*sizeof(int));
  32.     for (int i=0; i<N*N; i++) {
  33.         a[i]=i;
  34.         b[i]=i*2;
  35.     }
  36.     for (int i=0; i<N*N; i++) c[i]=0;
  37.     printf("Initialization is finished\n");
  38.     cudaMemcpy(dev_a, a,N*N*sizeof(int),cudaMemcpyHostToDevice);
  39.     cudaMemcpy(dev_b, b,N*N*sizeof(int),cudaMemcpyHostToDevice);
  40.     cudaMemcpy(dev_c, c,N*N*sizeof(int),cudaMemcpyHostToDevice);
  41.  mult<<<1,128>>>(dev_a,dev_b,dev_c);
  42.     printf("Done");
  43.     cudaMemcpy(c, dev_c,N*N*sizeof(int),cudaMemcpyDeviceToHost);
  44.     for (int i=0; i<N*N; i++) {
  45.         if (i%N==0) printf("\n");
  46.         printf("%i ",a[i]);
  47.     }
  48.     printf("\n");
  49.     for (int i=0; i<N*N; i++) {
  50.         if (i%N==0) printf("\n");
  51.         printf("%i ",b[i]);
  52.     }
  53.     printf("\n");
  54.     for (int i=0; i<N*N; i++) {
  55.         if (i%N==0) printf("\n");
  56.         printf("%i ",c[i]);
  57.     }
  58.         _getch();
  59.     cudaFree( dev_a);
  60.     cudaFree( dev_b);
  61.     cudaFree( dev_c);
  62.     free(a);
  63.     free(b);
  64.     free(c);
  65.     return 0;
  66. }

Forums: 

У Вас не правильно задан

У Вас не правильно задан вызов ядра: mult<<<1,128>>> - так параметр "y" у blockId и threadId всегда будет нулевым. Правильно делать так (если позволяет аппаратура):

dim2 thread(128, 128)
mult<<<1,thread>>>