当我在系统上运行此代码时,几秒钟后,系统卡住了,必须再次重新启动系统。所以我的问题是我在这里做错了什么?任何建议将不胜感激。
__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;
}
答案 0 :(得分:-1)
假设当您的意思是系统被卡住时,您的程序中会出现某种错误,则很可能是您正在访问无效的内存。
当k + row * width的索引超出了您在cudaMallocManaged中分配的内存大小时,这可能在d_M和d_N迭代的较高索引中。
在这样的情况下,使用cudaPeekatLastError()之类的命令添加一些错误处理总是一个好的习惯。
This link可能有助于实施某些调试。