使用nvcc CUDA编译器时,分段错误的一些可能原因是什么



我有一个CUDA类,我们称之为A,它在头文件中定义。我已经编写了一个测试内核,它创建了A类的实例,该实例编译良好并产生预期的结果。

此外,我有我的主CUDA内核,它也能很好地编译并产生预期的结果。然而,当我向主内核添加代码以实例化类A的实例时,nvcc编译器会因分段错误而失败。

更新:

为了澄清,分段错误发生在编译期间,而不是运行内核时。我用来编译的行是:

`nvcc --cubin -arch compute_20 -code sm_20 -I<My include dir> --keep kernel.cu`

其中<My include dir>是指向包含一些实用工具头文件的本地路径的路径。

我的问题是,在花费大量时间隔离展示该行为的最小示例(由于相对较大的代码库,这不是微不足道的)之前,有人遇到过类似的问题吗?如果内核太长或使用了太多寄存器,nvcc编译器会失败并死亡吗?

如果像寄存器计数这样的问题会以这种方式影响编译器,那么我需要重新思考如何实现我的内核以使用更少的资源。这也意味着,将事情简化为一个最小的例子可能会使问题消失。然而,如果这根本不可能,我不想在死胡同上浪费时间,而是会尽量把事情简化为一个最小的例子,并向NVIDIA提交一份错误报告。

更新:

根据@njuffa的建议,我在启用-v标志的情况下重新运行编译。输出以以下内容结束:

#$ ptxas  -arch=sm_20 -m64 -v  "/path/to/kernel_ptx/kernel.ptx"  -o "kernel.cubin" 
Segmentation fault
# --error 0x8b --

这表明问题是由于ptxas程序无法从ptx文件生成CUDA二进制文件造成的。

这似乎是CUDA 5.0ptxas汇编程序中某种真正的错误。该问题已报告给NVIDIA,我们可以假设,在提出该问题并添加此答案后的三年多时间里,该问题已得到修复。

[这个答案是从评论中收集的,并作为社区wiki条目添加,以将这个问题从未回答的问题列表中删除]

最新更新