我有一个 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.0
ptxas
汇编器中的某种真正的错误。该问题已报告给 NVIDIA,我们可以假设该问题在提出问题并添加此答案后三年多的某个时间得到了修复。
[此答案已根据评论汇总,并添加为社区 wiki 条目,以便将此问题从未回答的问题列表中删除]