如何在没有主机编译器的情况下创建 Cuda 模块

Posted

技术标签:

【中文标题】如何在没有主机编译器的情况下创建 Cuda 模块【英文标题】:How to create a Cuda module without a host compiler 【发布时间】:2015-08-04 20:27:50 【问题描述】:

我想创建一个用于 Cuda 驱动程序 API 的 Cuda 模块,而无需与主机编译器交互。这样做的主要推动力是,我小组中关于何时更改主机编译器和 cuda 编译器版本的决定并不总是在我们的控制范围内。我想防止一方面升级导致主机和 cuda 编译器之间不兼容的情况。

例如,我有一个文件 test.cu,它只包含 cuda 设备代码。我想把它编译成ptx:

nvcc --ptx kernel.cu

然后像这样将其加载到我的执行程序中:

cuModuleLoad(&module, "kernel.ptx");

当我尝试编译 cuda 文件时,出现以下错误:

In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0,
             from <command-line>:0:
/usr/local/cuda/bin/../include/host_config.h:82:2: 
error: #error -- unsupported GNU version! gcc 4.5 and up are not supported!

由于我的代码中没有包含 cuda_runtime.h,我以详细模式编译以查看发生了什么,并看到第一步是使用我的主机编译器并强制包含此文件:

> nvcc --verbose --ptx kernel.cu
#$ gcc -E -x c++ -D__CUDACC__ -C  "-I/usr/local/cuda/bin/../include"
"-I/usr/local/cuda/bin/../include/cudart"   -include "cuda_runtime.h"
-m64 -o "/tmp/tmpxft_00001058_00000000-4_kernel.cpp4.ii" "kernel.cu" 

由于我知道我的 .cu 文件没有主机代码,我想强制 nvcc 跳过主机集成步骤,但我找不到这样做的方法。有谁知道是否/如何做到这一点?

【问题讨论】:

nvcc 不是编译器,它需要主机预处理器和编译器来编译设备代码。没有办法绕过它AFAIK 是的,nvcc 不是编译器,但它确实有能力,一旦代码被分成主机和设备部分,将设备代码路由到仅设备编译轨迹(导致我想要的 ptx 文件)。我想问题真的是我可以告诉nvcc我已经拆分了代码并且没有需要编译的主机代码。 您无法获得主机编译器、创建 ptx 文件并丢弃其他所有内容是否有原因? @BlakeNelson:看看this 图表。在设备代码轨迹中(在您的术语中“拆分”之后),在调用设备编译器之前会连续调用 CUDA 和主机预处理器。这些预处理器步骤包括设备标准库重载和在设备代码中执行宏扩展。我认为没有办法解决它。 【参考方案1】:

似乎没有一种方法可以随心所欲。我会使用 `nvcc --keep --ptx code.cu" 编译并逐步完成编译。这样做我看不到证据表明你想做的事情可以使用 nvcc。

【讨论】:

以上是关于如何在没有主机编译器的情况下创建 Cuda 模块的主要内容,如果未能解决你的问题,请参考以下文章

CUDA nvcc慢主机代码

在没有物理 NVidia GPU 卡的虚拟机上运行 CUDA

如何使用软件实现在没有 GPU 的情况下运行 CUDA?

如何设计一个仅在其中一个部分使用 CUDA 的库,以便其他部分在没有安装 CUDA 的情况下也可以工作?

如何在没有模块加载系统的情况下将我的 Typescript 编译成单个 JS 文件?

如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?