如何从cudaerrorunknown中排除cudaerrunknown()

How to troubleshoot cudaErrorUnknown from cudaDeviceSynchronize()?

本文关键字:cudaerrunknown 排除 cudaerrorunknown      更新时间:2023-10-16

我有一个大型代码库,该代码库可以用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的知识。