C++ Cuda矩阵乘法给出了错误的答案

C++ Cuda矩阵乘法给出了错误的答案,c++,cuda,matrix-multiplication,C++,Cuda,Matrix Multiplication,更新 我当前的代码没有检查越界内存访问。当我运行cuda memcheck时,它说即使对于只有2乘2的矩阵,内存访问也是不好的!我正在访问不应该访问的内存,这就是问题所在 要检查越界内存访问,请运行cuda memcheck./(在此处插入可执行文件) 下面是我的矩阵乘法代码: dim3 block(32,32); dim3 grid( (n+31)/32, (n+31)/32 ); matrixMul<<<grid,block>>>(d_C, d_A, d_

更新

我当前的代码没有检查越界内存访问。当我运行cuda memcheck时,它说即使对于只有2乘2的矩阵,内存访问也是不好的!我正在访问不应该访问的内存,这就是问题所在

要检查越界内存访问,请运行cuda memcheck./(在此处插入可执行文件)

下面是我的矩阵乘法代码:

dim3 block(32,32);
dim3 grid( (n+31)/32, (n+31)/32 );
matrixMul<<<grid,block>>>(d_C, d_A, d_B, n, k);
dim3块(32,32);
dim3网格((n+31)/32,(n+31)/32);
矩阵mul(d_C,d_A,d_B,n,k);
kA和kB是包含值的矩阵(为了更简单,它们都是2)

m、 n,k对于我的平方矩阵都是相同的数

kC是存储答案的矩阵

#ifndef _MATRIXMUL_KERNEL_H_
#define _MATRIXMUL_KERNEL_H_

#include <stdio.h>

__global__ void matrixMul(float *kC, float *kA, float *kB, int n, int k)
{

    int tx = blockIdx.x * 32 + threadIdx.x;
    int ty = blockIdx.y * 32 + threadIdx.y;
    float value = 0;

    for (int i=0;i<n;i++)
    {
        float elementA=kA[ty*n+i];
        float elementB=kB[i*k+tx];
        value += elementA*elementB;
    }

    kC[ty*n+tx] = value;
}

#endif // #ifndef _MATRIXMUL_KERNEL_H_
\ifndef\u MATRIXMUL\u KERNEL\u H_
#定义_矩阵_内核_H_
#包括
__全局无效矩阵mul(浮点*kC,浮点*kA,浮点*kB,整数n,整数k)
{
int tx=blockIdx.x*32+threadIdx.x;
int ty=blockIdx.y*32+threadIdx.y;
浮点数=0;

对于(inti=0;i,根据定义线程网格的方式,应该向内核代码添加如下线程检查:

#ifndef _MATRIXMUL_KERNEL_H_
#define _MATRIXMUL_KERNEL_H_

#include <stdio.h>

__global__ void matrixMul(float *kC, float *kA, float *kB, int n, int k)
{

    int tx = blockIdx.x * 32 + threadIdx.x;
    int ty = blockIdx.y * 32 + threadIdx.y;

    if ((ty < n) && (tx < n)) { // add this line
      float value = 0;

      for (int i=0;i<n;i++)
      {
        float elementA=kA[ty*n+i];
        float elementB=kB[i*k+tx];
        value += elementA*elementB;
      }

      kC[ty*n+tx] = value;
    }  //  add this line
}

#endif // #ifndef _MATRIXMUL_KERNEL_H_
\ifndef\u MATRIXMUL\u KERNEL\u H_
#定义_矩阵_内核_H_
#包括
__全局无效矩阵mul(浮点*kC,浮点*kA,浮点*kB,整数n,整数k)
{
int tx=blockIdx.x*32+threadIdx.x;
int ty=blockIdx.y*32+threadIdx.y;
如果((tyfor(int i=0;我只是内存不足或其他什么?变量
的定义在哪里?您是否在for循环之前将其初始化为零?此代码看起来无法编译。@Robert Crovella我的错,我在移动代码时写错了变量名。它应该是“float value”,而不是“浮点存储”。不过我的程序中有“浮点值”。如果它一直工作到10x10,你认为它可能是我的内存吗?在10x10之后,矩阵的某些行的值会加倍,或者有时是其他的……这个内核没有像
if((ty
。所以你也应该显示你的内核调用,可能还有主机代码的数据副本部分。@Robert Crovella我更新了代码以显示所有内容。哇,这修复了所有内容。我很感激。因此,基本上现在发生的是,线程是根据我的内核调用初始化的,并且即使没有b,也会运行没有if语句的ounds?是的,通过内核调用定义网格的大小。当内核使用该网格启动时,所有这些线程都将启动,并在某个时候开始执行线程代码(内核代码)。