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

Mat*_*hew 47 cuda g++ nvcc

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

这是我的问题:

  1. 如何使用nvcc编译成cubin文件或ptx文件?我不需要-c或其他东西吗?
  2. 我想使用哪种文件类型?
  3. 有哪些g ++命令可以正确地编译和链接项目?

假设如下:

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

Mat*_*hew 50

我能用几个不同的帖子解决我的问题,包括这些帖子.不要忘记,如果您使用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 -f *.o program
Run Code Online (Sandbox Code Playgroud)

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

  • 小心,你干净的目标将删除所有以'o'结尾的文件.你可能想要`clean:rm -rf*.o program` (4认同)

har*_*ism 15

对这个最近问题的回答可能描述了你需要什么.

另外两点说明:

  1. 您不需要将.cu编译为.cubin或.ptx文件.您需要将其编译为.o对象文件,然后将其与.gpp编译的.cpp文件中的.o对象文件链接.
  2. 除了把你的CUDA内核代码中cudaFunc.cu,你也需要把C或C++封装函数该文件中启动内核(除非你使用CUDA驱动程序API,这是不可能的,不推荐).还要添加包含此包装函数原型的头文件,以便将其包含在需要调用CUDA代码的C++代码中.然后使用标准g ++链接线将文件链接在一起.

我开始重复我的其他答案,所以我建议你只是阅读它.:)


Jea*_*lho 10

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

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

clean: rm -rf *.o
Run Code Online (Sandbox Code Playgroud)