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

How to create a Cuda module without a host compiler

我想创建一个用于 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 跳过主机集成步骤,但我找不到这样做的方法。有谁知道if/how这可以做到吗?

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