如何在没有主机编译器的情况下创建 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 模块的主要内容,如果未能解决你的问题,请参考以下文章
在没有物理 NVidia GPU 卡的虚拟机上运行 CUDA
如何设计一个仅在其中一个部分使用 CUDA 的库,以便其他部分在没有安装 CUDA 的情况下也可以工作?