1

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

此外,我有我的主 CUDA 内核,它也可以很好地编译并产生预期的结果。但是,当我将代码添加到主内核以实例化 class 的实例时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 二进制文件造成的。

4

1 回答 1

3

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

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

于 2016-05-15T07:22:12.237 回答