系统陷入使用CUDA的运行矩阵乘法

时间:2018-10-07 08:04:49

标签: 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 && 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;

}

1 个答案:

答案 0 :(得分:-1)

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

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

在这样的情况下,使用cudaPeekatLastError()之类的命令添加一些错误处理总是一个好的习惯。

This link可能有助于实施某些调试。