首先,我是完全无法创建MCVE的,因为我只能在运行完整代码时重现此错误,任何在较简单环境中测量或复制该错误的尝试都会使其消失。 TDLR我怀疑它不是代码问题,而是配置问题。
对于CUDA内核中的一些数学,我有一段代码。我有Windows机器Win10 x64,GTX 1050,CUDA 9.2和Ubuntu 17.04、2xGTX 1080 Ti,CUDA 9.1。
我的代码在Windows计算机上运行良好。它很长(对于大样本,每个内核调用大约700ms),因此我需要增加Windows中的TDR值。该代码还(目前)强制其在1个GPU中运行,这是使用cudaSetDevice(0)
选择的第一个GPU。
当我将相同的输入数据和代码复制到linux机器上时(我使用git,它是相同的代码),我要么得到
an illegal memory access was encountered
或
unspecified launch failure
在调用GPU后进行错误检查。
如果我更改内核以进行数学运算,只在输出中写一个数字,则内核将正确执行。其他CUDA代码(我拥有的不同功能)也可以正常工作。所有这些使我认为代码外部存在问题,而不是代码本身存在问题,也不是驱动程序/环境变量的常规配置存在问题。
我读到xorg.conf
会影响内核的超时。按照here的建议,我生成了一个xorg.conf(我没有)并从那里删除设备。我正在远程连接到服务器,并且没有插入任何监视器。这不会改变行为,我的内核仍然出错。
我的问题是:我还应该看什么?我应该查看哪种特定于Linux的配置来查明内核停止的原因?
答案 0 :(得分:0)
错误最终实际上是非法的内存访问。
这些是由于sizeof(unsigned long)
是特定于机器的事实造成的,而我的linux机器返回8,而我的windows机器返回4。因为此代码是从MATLAB和MATLAB调用的(像其他一些高级语言,例如如python)以位(例如uint32(1)
)定义变量的大小,在进行memcpys时linux机器不匹配。事实证明,这是在索引变量中发生的,因此内核正在读取垃圾(由于错误的memcpy),但是随后尝试访问该位置的另一个数组,从而产生了非法的内存错误。
太具体了吗?是的。