如何使用 CUDA_LAUNCH_BLOCKING=1 进行调试,举个例子
时间: 2023-12-14 11:36:54 浏览: 264
CUDA:主导GPU计算的革命
`CUDA_LAUNCH_BLOCKING=1` 可以用来在 CPU 上模拟 GPU 的运行过程,以便于调试 CUDA 程序。
下面是一个使用 `CUDA_LAUNCH_BLOCKING=1` 进行调试的例子:
1. 编写 CUDA 程序 `test.cu`:
```cuda
#include <stdio.h>
__global__ void add(int *a, int *b, int *c) {
int tid = blockIdx.x * blockDim.x + threadIdx.x;
c[tid] = a[tid] + b[tid];
}
int main() {
int N = 1024;
int size = N * sizeof(int);
int *a, *b, *c;
cudaMalloc(&a, size);
cudaMalloc(&b, size);
cudaMalloc(&c, size);
int *ha = (int *)malloc(size);
int *hb = (int *)malloc(size);
int *hc = (int *)malloc(size);
for (int i = 0; i < N; i++) {
ha[i] = i;
hb[i] = N - i;
}
cudaMemcpy(a, ha, size, cudaMemcpyHostToDevice);
cudaMemcpy(b, hb, size, cudaMemcpyHostToDevice);
dim3 dimGrid(1, 1, 1);
dim3 dimBlock(N, 1, 1);
add<<<dimGrid, dimBlock>>>(a, b, c);
cudaDeviceSynchronize();
cudaMemcpy(hc, c, size, cudaMemcpyDeviceToHost);
for (int i = 0; i < N; i++) {
printf("%d + %d = %d\n", ha[i], hb[i], hc[i]);
}
free(ha);
free(hb);
free(hc);
cudaFree(a);
cudaFree(b);
cudaFree(c);
return 0;
}
```
2. 使用 `nvcc` 编译程序:
```bash
$ nvcc test.cu -o test
```
3. 运行程序,使用 `CUDA_LAUNCH_BLOCKING=1` 进行调试:
```bash
$ CUDA_LAUNCH_BLOCKING=1 ./test
```
在运行过程中,程序会在每个 kernel 执行结束后暂停,等待用户输入任意键后继续执行下一个 kernel。这样就可以逐步进行调试了。
阅读全文