【发布时间】:2012-11-29 13:39:02
【问题描述】:
我有一个 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 二进制文件。
【问题讨论】:
-
nvcc 是“编译器驱动程序”,而不是编译器。您确定 seg 故障来自 nvcc 吗?
-
运行以下命令后出现seg错误:
nvcc --cubin -arch compute_20 -code sm_20 -I<my include dir> --keep kernel.cu -
您使用的是哪个 CUDA 版本?
-
如果 CUDA 5.0 编译器(即其组件之一)出现段错误,请通过 CUDA 注册开发者网站提交错误,并附上一个独立的重现案例。为了确保段错误确实在 CUDA 编译器组件中,暂时将 -v 添加到 nvcc 命令行,以便您可以看到每个底层编译器组件的调用。
-
编译器组件不应出现段错误,无论输入如何,因此这是 PTXAS 中的内部错误。您可以在此处访问已注册的开发者网站:developer.nvidia.com/cuda-toolkit。向下滚动到显示“CUDA 注册开发人员计划的成员可以报告问题和提交错误”的位置(如果您还不是注册开发人员,注册请求通常会在一个工作日内处理)。由于问题出在 PTXAS 上,因此您需要将 PTX 输入文件附加到错误中并记下确切的 PTXAS 命令行。
标签: compiler-construction cuda segmentation-fault nvcc