如何从cudaerrorunknown中排除cudaerrunknown()
How to troubleshoot cudaErrorUnknown from cudaDeviceSynchronize()?
我有一个大型代码库,该代码库可以用CUDA内核执行RGB进行YUV颜色转换。由于我进行了很多并行的转换,因此我使用流(也许在这里相关)。该代码在Linux上运行,在Quadro K4200 GPU上运行良好,但我最近得到了一个新的Quadro P4000 GPU,在调用cudaDeviceSynchronize()
时,我会不断地获得cudaErrorUnknown
。在此之前,我唯一要做的是呼叫cuMemcpy2DAsync
复制像素数据,然后呼叫我的内核。代码库很大,我可以共享一些相关的部分,但是任何人都可以提供建议,我该如何解决这个问题?由于我一直在使用K4200,因此我没有更改CUDA编译器标志。我应该这样做吗?我目前正在使用以下标志编译这两张卡的相同代码:
--compiler-bindir /usr/bin/gcc-4.9 -gencode=arch=compute_30,code="sm_30,compute_30" -cudart static -maxrregcount=0 --machine 64 --compile -g -G -std=c++11 -D_MWAITXINTRIN_H_INCLUDED
但是,在这种情况下,甚至有可能制作一个在不同GPU上运行的对象?
这是nvidia-smi
的输出:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90 Driver Version: 384.90 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Quadro P4000 Off | 00000000:04:00.0 Off | N/A |
| 46% 39C P0 29W / 105W | 0MiB / 8112MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Quadro K4200 Off | 00000000:84:00.0 Off | N/A |
| 30% 40C P0 26W / 110W | 0MiB / 4036MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
我应该禁用旧卡吗?驾驶员看到这两张卡的行为是否不正确?我可以使用任何内部NVIDIA日志/工具来获取失败的更详细说明吗?
如何进行故障排除...?
通过将您的程序转换为
最小,完整,可验证的示例(MCVE)
这个问题的表现。
这将把您的"嫌疑人列表"集中在很少的CUDA API电话上,这要么足以让您自己找出问题,要么可以使您发布整个内容(在一个不同的问题中)在这里获得适当的帮助。否则,您会发现当您丢弃代码的部分时,问题就会消失,这意味着它在您刚刚删除的内容中。
按照@tera建议的Quadro P4000将其修复为 @tera -gencode=arch=compute_61,code=sm_61
,将内核重新编译为Quadro P4000,但是现在相同的代码在Quadro K4200上失败,但是这次使用合理的错误cudaErrorNoKernelImageForDevice
:6:
这表明没有适合该设备的内核图像。当用户指定不包括相应设备配置的特定CUDA源文件的代码生成选项时,可能会发生这种情况。
显然我最大的问题是缺乏了解可能导致cudaErrorUnknown
的知识。