【问题标题】:How can I compile CUDA code then link it to a C++ project?如何编译 CUDA 代码然后将其链接到 C++ 项目?
【发布时间】:2012-03-14 08:00:59
【问题描述】:

我正在寻求有关 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 中的整数数组。

【问题讨论】:

    标签: cuda g++ nvcc


    【解决方案1】:

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

    补充几点:

    1. 您无需将.cu 编译为.cubin.ptx 文件。您需要将其编译为 .o 目标文件,然后将其与使用 g++ 编译的 .cpp 文件中的 .o 目标文件链接。
    2. 除了将您的 cuda 内核代码放入 cudaFunc.cu 之外,您还需要在启动内核的文件中放入一个 C 或 C++ 包装函数(除非您使用的是 CUDA 驱动程序 API,这不太可能且不推荐)。还要添加一个带有此包装函数原型的头文件,以便您可以将其包含在需要调用 CUDA 代码的 C++ 代码中。然后使用标准 g++ 链接线将文件链接在一起。

    【讨论】:

    • 哈里斯,谢谢你的回答。我现在更接近了。我可以使用 nvcc 编译器和 .cu 文件(我将其重命名为 cudacode.cu)进行编译,并且我有一个 cudacode.o 对象,但是现在当我尝试在 g++ 上编译时,我得到 cudacode.o: In function wrapper(int*, int*, int*, int)': tmpxft_00000d3a_00000000-1_cudacode.cudafe1.cpp:(.text+0x30): undefined reference to cudaMalloc'
    • 你需要链接libcudart。首先弄清楚 libcudart.so 在哪里——默认情况下,我认为它会进入 /usr/local/bin/cuda,但这会因安装而异。找到路径后,将其添加到您的链接行:-L<path to CUDA libs> -lcudart
    • 你是我的英雄!谢谢。我遇到的另一个问题是我在 64 位机器上,所以我必须链接到 lib64 文件。就在三个小时前,我还不知道如何使用 g++,不知道 make 文件是什么,也不知道如何链接。我想这就是我在 Windows 上长大的结果。
    【解决方案2】:

    我能够通过几个不同的帖子解决我的问题,包括这些帖子。不要忘记,如果您使用 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
    

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

    【讨论】:

    • 你能提供一个最小的.cu.cpp 文件你测试过吗?对所使用的 include 感到好奇,cpp,尤其是如何从 .cu 中查看内核 __global__ 函数。
    • 小心,您的干净目标将删除所有以“o”结尾的文件。你可能想要clean: rm -rf *.o program
    • 谢谢Matthew,这很有帮助。
    • 我在生成的目标文件中得到了错误的名称(对于我需要从我的非.cu 文件中调用的函数)。有人知道如何解决这个问题吗?
    【解决方案3】:

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

    all:
    nvcc cudafile.cu mainfile.cpp -o executable
    
    clean: rm -rf *.o
    

    【讨论】:

    • 我会使用 rm -f 而不是 rm -rf,因为 *.o 文件应该是常规文件,我害怕犯致命错误:theregister.co.uk/2015/01/17/…
    • @Adam P. Goucher 如果在 Ubuntu 上,您可以安装 safe-rm :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多