调试一个CUDA核函数过程中发现一个奇怪的问题:
调用某个核函数,程序耗时33秒,并且主要时间是main()函数结束后的33秒;
而注释掉此核函数,程序执行不到1秒。
由此可见,可能是某种栈溢出,导致了程序运行异常。
但是,为什么程序的效果看起来是在main函数结束后还继续卡死这么长时间呢?并且没有任何core文件,很神奇!
====================================================
2019-05-23补充:
1.确实是核函数中有越界,导致程序逻辑执行完成后又卡死了30秒;
2. 解决的办法如下:
nvcc编译的时候加上 -g -G, 去掉 -O2
使用 cuda-gdb调试,
b _kennel
r param
n
p var
3. 要注意:break在核函数才能单独调试核函数;break在C函数,是无法单步到核函数的。
4.强制指针类型转换,会被认为是越界:
uint8_t* start = ...;
uint32_t pixel_val = *(uint32_t*)(start + x * channels);
5.我在计算核函数的计算时间的时候,总是不准确。
有效的方法是调用核函数后立即执行:cudaDeviceSynchronize();