cuda-memcheck とかいう CUDA で valgrind みたいなことができるツールがある。
↓こんなードを書いたとする。
#include <stdio.h> __global__ void f(int *ptr) { int tid = threadIdx.x; ptr[tid] = tid; } int main() { int *dmem; int hmem[32]; memset(hmem, 0, sizeof(hmem)); cudaMalloc(&dmem, 32); cudaMemcpy(dmem, hmem, 32, cudaMemcpyHostToDevice); f<<<1,32>>>(dmem); cudaMemcpy(hmem, dmem, 32, cudaMemcpyDeviceToHost); printf("%d\n", hmem[4]); }
いちおう動いているように見えるが、間違っている。(どこが間違ってるかすぐわかる人偉い)
ビルドするときに、
$ nvcc -G -g hoge.cu
とかする(必須ではない)
んで、
$ cuda-memcheck ./a.out
とかやると
========= Invalid __global__ write of size 4 ========= at 0x000000d0 in /home/w0/test/cuda/memcheck.cu:6:f(int*) ========= by thread (31,0,0) in block (0,0,0) ========= Address 0x70014007c is out of bounds ========= Saved host backtrace up to driver entry point at kernel launch time ========= Host Frame:/lib64/libcuda.so (cuLaunchKernel + 0x331) [0xcd5d1] ========= Host Frame:./a.out [0x1b698] ========= Host Frame:./a.out [0x3ab63] ========= Host Frame:./a.out [0x2937] ========= Host Frame:./a.out [0x280d] ========= Host Frame:./a.out [0x2827] ========= Host Frame:./a.out [0x2750] ========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b75] ========= Host Frame:./a.out [0x24e9]
メモリアクセスエラーしてるのがわかる。
あと cuda-gdb から set cuda memcheck しても同じようなことをデバッガからできる、とか書いてある。
http://docs.nvidia.com/cuda/cuda-memcheck/index.html