【问题标题】:What are some possible causes of a segmentation fault when using the nvcc CUDA compiler?使用 nvcc CUDA 编译器时,有哪些可能导致分段错误的原因?
【发布时间】: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`

&lt;My include dir&gt; 是包含一些实用程序头文件的本地路径的路径。

我的问题是,在花费大量时间隔离展示行为的最小示例之前(由于代码库相对较大,这不是微不足道的),有没有人遇到过类似的问题?如果内核太长或使用的寄存器太多,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&lt;my include dir&gt; --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


【解决方案1】:

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

[此答案由 cmets 组装而成,并添加为社区 wiki 条目,以将此问题从未回答的问题列表中删除]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2010-11-14
    • 2016-03-20
    • 2010-10-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多