如何编译CUDA代码然后将其链接到C ++项目?

时间:2012-02-23 20:53:30

标签: cuda g++ nvcc

我正在寻找帮助开始涉及CUDA的项目。我的目标是有一个项目,我可以在本机g ++编译器中编译,但使用CUDA代码。我知道我必须在nvcc编译器中编译我的CUDA代码,但根据我的理解,我可以以某种方式将CUDA代码编译成cubin文件或ptx文件。

以下是我的问题:

  1. 如何使用nvcc编译成cubin文件或ptx文件?我不需要-c或其他东西吗?
  2. 我想使用哪种文件类型?
  3. 正确编译和链接项目的g ++命令是什么?
  4. 假设如下:

    1. 我有一个名为“main.cpp”的文件,其中包含一个main函数,包含cuda.h。
    2. 我有另一个名为“cudaFunc.cu”的文件,里面有CUDA代码。比方说,我想添加两个存在于main.cpp中的整数数组。

3 个答案:

答案 0 :(得分:48)

我能够用几个不同的帖子解决我的问题,包括这些帖子。不要忘记,如果您使用64位机器链接到64位库!它接缝有点明显,但对于像我这样的小丑,这是我忘了的东西。这是我现在使用的make文件...如果你可以消化这个make文件,你应该能够做我想做的事情,这是cuda代码和其他G ++代码的单独编译。还要记住,你必须在某些版本上使用gcc,g ++编译器(我正在使用g ++ - 4.4并且它对我有用)无论如何,这里是make文件......

all: program

program: cudacode.o
    g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp  cudacode.o 

cudacode.o:
    nvcc -c -arch=sm_20 cudacode.cu 

clean: rm -rf *o program

希望您能看到我做的第一件事是使用nvcc编译器和-c选项编译cudacode(已保存为.cu)(另请注意,您可能要删除-arch = sm_20) 。这创造了一个cudacode.o。然后我使用带有-o选项的g ++编译器并链接到lib64库并链接lcuda和lcudart文件以及编译我的main.cpp然后链接cudacode.o。希望这有助于某人!

答案 1 :(得分:15)

我的回答to this recent question可能描述了您的需求。

补充说明:

  1. 您无需将.cu编译为.cubin或.ptx文件。您需要将其编译为.o对象文件,然后将其与.gpp编译的.cpp文件中的.o对象文件链接。
  2. 除了将cuda内核代码放在cudaFunc.cu中之外,还需要在启动内核的文件中放置一个C或C ++包装函数(除非您使用的是CUDA驱动程序API,这是不太可能的,不建议使用)。还要添加包含此包装函数原型的头文件,以便将其包含在需要调用CUDA代码的C ++代码中。然后使用标准g ++链接将文件链接在一起。
  3. 我开始重复我的other answer,所以我建议你阅读它。 :)

答案 2 :(得分:10)

我发现将编译好的cuda目标代码与g ++链接起来很麻烦。 尝试像这样编译它:

all:
nvcc cudafile.cu mainfile.cpp -o executable

clean: rm -rf *.o