我有一些非常简单的代码来近似统一3D网格上的偏导数。我正在运行科学linux,当我用nvcc编译时,我没有得到任何错误或警告。我检查每次cudaSuccess
和cudaMalloc()
来电都返回cudaMemcpy()
,确实一切正常。
当我在没有调试器的情况下运行我的程序时,除了内核实际上似乎没有执行外,一切似乎都能正常工作。我为我的输出分配的数组(初始化为保存全零)在内核启动后仍然全部为零,即使我做了一些愚蠢的事情,比如让每个线程将数组的索引设置为5。
所以当我尝试在这段代码上使用cuda-gdb时,它会说cudaLaunch()
返回0x9。我不确定9是什么错误,并且无法通过谷歌搜索快速找到它。所以在我写出代码之前,哪个错误是9号?是否列出了数字如何与特定错误匹配?
是否有关于错误编号如何映射到特定错误的在线列表?
我没有这台机器上的代码,但它类似于:
dim3 dimGrid(1,1,1);
dim3 dimBlock(mx,my,mz);
x_derivative<<<dimGrid,dimBlock>>>(f_d,df_d);
其中(当前)mx=my=mz=64
。
也许64 ^ 3的线程数太大了?很明显,GPU上没有那么多实际线程(这是特斯拉C2050 fwiw),但我想我可以指定任意数量的线程?值得注意的是,这是算法的“天真”版本,所以我不打算优化性能(还)。
答案 0 :(得分:1)
每个块的最大线程数为512或1024,具体取决于您的设备。所以是的,64 ^ 3确实太大了。
答案 1 :(得分:0)
仅供参考,如果您在发布后检查了错误代码,那么您可以节省大量时间。由于启动后没有同步,如果检查内核启动的结果,它将只给出内核启动的结果,而不是完整的内核执行本身。