Cuda矩阵乘法 - 错误的结果

时间:2013-05-30 12:42:40

标签: cuda

这是我的矩阵乘法代码,但是当我运行它时,我得到第一行的正确结果,但第二行和第三行的错误结果(主要是大负数)。这是我的第一个程序,所以我使用了一些我在网上找到的代码

 #include <iostream>

__global__ void MnozenjeMatrica(int* d_c, int* d_a, int* d_b)
{
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;    

int d = 0;
for(int i=0; i<3; i++)
{
    int x = d_a[row * 3 + i];
    int y = d_b[i * 3 + col];
    d += x * y;
}

d_c[row * 3 + col] = d; 
}

int main()
{
const int SIZE = 9 * sizeof(int); 

int a[3][3] = {{2, 4, 6}, {1, 3, 5}, {8, 4, 1}};
int b[3][3] = {{5, 8, 34}, {5, 7, 5}, {1, 4, 31}};
int c[3][3] = {{5, 8, 34}, {5, 7, 5}, {1, 4, 31}};

int* d_a;
int* d_b;
int* d_c;

cudaMalloc((void**) &d_a, SIZE);
cudaMalloc((void**) &d_b, SIZE);
cudaMalloc((void**) &d_c, SIZE);

cudaMemcpy(d_a, a, SIZE, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, SIZE, cudaMemcpyHostToDevice);

MnozenjeMatrica<<<3, 3>>>(d_c, d_a, d_b);
cudaMemcpy(c, d_c, SIZE, cudaMemcpyDeviceToHost);

for(int i=0; i<3; i++)
{
    for(int j=0;  j<3; j++)
    {
        printf("%d\t", c[i][j]);
    }
    printf("\n");
}


 }

1 个答案:

答案 0 :(得分:1)

完全同意@talonmies。

更多建议:

  • 有很多人发布了关于cuda的问题 矩阵乘法,你可以看看其中的一些 一些想法。
  • 你没有在内核上做任何cuda error checking 电话和cuda电话(但建议)
  • 您可以尝试使用cuda-memcheck运行代码,并查看其内容。
  • 您可以使用一些选择printf语句快速调试此内核。毕竟这主要是C代码,你应该考虑使用基本的C故障排除技术。

由于我能够快速发现这一点,我可以告诉你,你的内核依赖于二维线程块结构来做任何有用的事情:

int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;

但是你正在推出一维1D线程块网格:

MnozenjeMatrica<<<3, 3>>>(d_c, d_a, d_b);
                  ^  ^
                  |  1-D threadblock (3 threads)
                  1-D grid (3 blocks)

所以我并不感到惊讶它只适用于一行。