Cuda矩阵乘法-错误结果

Cuda矩阵乘法-错误结果,cuda,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 * block

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

 #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");
}


 }
#包括
__全局无效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;

对于(inti=0;i完全同意@talonmies

更多建议:

  • 有很多人已经发布了关于cuda的问题 矩阵乘法,你可以看看其中的一些 一些想法
  • 您没有在内核上执行任何操作 呼叫和cuda呼叫(但建议使用)
  • 您可以尝试使用
    cuda memcheck
    运行您的代码,并查看它的说明
  • <> LI>您可以用一些选择<代码> PROTFF 语句很快调试这个内核。这主要是C代码,您应该考虑使用基本的C故障排除技术。
由于我能够快速发现这一点,我可以告诉您,您的内核依赖于二维threadblock结构来执行任何有用的操作:

int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
但您正在启动由1D螺纹块组成的1D网格:

MnozenjeMatrica<<<3, 3>>>(d_c, d_a, d_b);
                  ^  ^
                  |  1-D threadblock (3 threads)
                  1-D grid (3 blocks)
MnozenjeMatrica(d_c,d_a,d_b);
^  ^
|1-D螺纹块(3个螺纹)
1-D网格(3个块)

因此,我并不惊讶它只适用于一行。

您在这里没有提出任何问题。我需要解决错误以获得正确的结果:)我需要理发和三明治。这并不意味着我有一个有效的堆栈溢出问题。你似乎也没有。这里的问题是为了对以后的其他人有用。“我的代码不起作用,请帮我修复它”很少属于这一类。