系统无法使用CUDA运行矩阵乘法

系统无法使用CUDA运行矩阵乘法,cuda,matrix-multiplication,Cuda,Matrix Multiplication,当我在我的系统上运行此代码时,几秒钟后,我的系统卡住了,我必须重新启动系统。所以我的问题是我做错了什么?任何建议都将不胜感激 __global__ void matMul(float* d_M, float* d_N, float* d_P, int width) { int row = blockIdx.y*width + threadIdx.y; int col = blockIdx.x*width + threadIdx.x; if (row < width &&

当我在我的系统上运行此代码时,几秒钟后,我的系统卡住了,我必须重新启动系统。所以我的问题是我做错了什么?任何建议都将不胜感激

__global__ void matMul(float* d_M, float* d_N, float* d_P, int width) {
int row = blockIdx.y*width + threadIdx.y;
int col = blockIdx.x*width + threadIdx.x;

if (row < width && col < width) {
    float product_val = 0;
        for (int k = 0; k < width; k++) {
            product_val += d_M[row*width + k] * d_N[k*width + col];
        }
    d_P[row*width + col] = product_val;
 }
}


int main() {
const int n = 9;
float* d_M;
float* d_N;
float* d_P;

cudaMallocManaged(&d_M, SIZE * sizeof(float));
cudaMallocManaged(&d_N, SIZE * sizeof(float));
cudaMallocManaged(&d_P, SIZE * sizeof(float));

for (int i = 0; i < n; ++i) {
    d_P[i] = 0;
}

int count = 0;
for (int i = 0; i < n; ++i) {
    d_N[i] = ++count;
}

count = 0;
for (int i = 0; i < n; ++i) {
    d_M[i] = ++count;
}

matMul <<<1, n>>> (d_M, d_N, d_P, 3);
cudaDeviceSynchronize();

for (int i = 0; i < n; ++i) {
    printf("%f\n", d_P[i]);
}
cudaFree(d_N);
cudaFree(d_M);
cudaFree(d_P);
return 0;
\uuuu全局\uuuu无效matMul(浮点*d\M,浮点*d\N,浮点*d\P,整数宽度){
int row=blockIdx.y*宽度+螺纹IDX.y;
int col=blockIdx.x*width+threadIdx.x;
如果(行<宽度和列<宽度){
浮点数乘积_val=0;
对于(int k=0;k

}

假设当您的系统卡住时,您的程序中会出现某种错误,那么您很可能正在访问无效的内存

当k+row*width索引超出您在cudaMallocManaged中分配的内存大小时,这可能在d_M和d_N迭代的较高索引中

在这种情况下,最好使用cudaPeekatLastError()等命令添加一些错误处理


可能有助于实现某些调试。

您发布的代码无法编译,因此很难说出哪里出了问题。我可以看到几个错误,但是您描述的行为更可能是CUDA安装中的错误,而不是代码中的错误。如果你想要一个有用的答案,请阅读网站上的所有内容并编辑你的问题accordingly@talonmies实际上,我在这里没有得到任何错误,因为我已经写了一个程序,它是向量加法,工作得很好。所以我很确定CUDA安装没有任何问题。您发布的代码(定义了大小并添加了include)编译和运行时没有错误(尽管存在错误,这意味着结果不正确)。代码中没有导致您描述的症状的错误。@Talonmes当我第二次运行程序时会发生这种情况。我刚刚用cuda memcheck在shell循环中运行了您的代码1000次。没有错误,抱歉,考虑到代码实际上不包含您推测的任何缺陷(我知道这一点,因为我运行了代码),这实际上是如何回答问题的?