LZ您好,19#是针对cudaGetLastError()的一些行为做的总结。
(1)根据19#的结果和总结,如果您使用了cudaMalloc()和同步版的cudaMemcpy(),之后使用cudaGetLastError(),那么
1)两个函数都是OK的,那么会显示no error
2)两个函数都出问题了,那么会显示错误,此时输出的应该是第二个函数的错误,第一个虽然也错了,但是缓冲区被第二个错误刷掉了。
3)如果第一个错误,第二个没错(假设第二个函数和第一个无关),那么得到的是第一个函数的报错信息。
4)如果第一个没错,第二个错误了,那么得到的是第二个函数的报错信息。
(2)请相信横扫斑竹。
祝您节日快乐~
(3)
另外,LZ如果需要详细检测错误,调试的话,也可以按照横扫斑竹的方法,使用每次都检测返回值的方法。
如18# 第二点
“每次都是用的返回值检测的错误, (包括异步的kernel用的cudaErrot_t r = cudaDeviceSynchronize(); 来实现返回值风格的取回错误)”
这个需要逐条检查,但是不会被cudaGetLastError()的缓冲行为所迷惑。
好的 !! 马上给给个kernel都加上 cudaErrot_t r = cudaDeviceSynchronize(); 检测~
谢谢!
以及,每个API调用。(你可以将来release的时候再去掉。只是为了确定问题的可能所在)
我在将在每个内核后使用
cudaError_t r3 = cudaDeviceSynchronize();
if (r3 != cudaSuccess) __debugbreak();
看是否会debug。
另外 每个api调用是什么意思?
今晚貌似信息量比较大,正在消化
指的是每个CUDA Runtime 的API函数的调用,比如那些cuda开头的函数,cudaMalloc()等。