12

我正在尝试修改用 C 编写的 GPL 程序。我的目标是用 CUDA 实现替换一种方法,这意味着我需要使用 nvcc 而不是 gcc 进行编译。我需要帮助构建项目 - 不实施它(你不需要知道任何关于 CUDA C 的帮助,我不认为)。

这是我第一次尝试更改涉及 .configure 和 Makefile 的中等复杂度的 C 项目。老实说,这是我很长时间以来第一次在 C 中做任何事情,包括任何涉及 gcc 或 g++ 的事情,所以我很迷茫。

我对学习配置和 Makefile 不是很感兴趣——这更像是一个实验。在花时间创建正确的构建脚本之前,我想看看项目实施是否顺利。(不是不​​愿意学习必要的,只是想给出一个范围的想法)。

话虽如此,我有什么选择来构建这个项目?我有无数的问题...

  • 我尝试在 AC_PROG_CC 之后将“CC=nvcc”添加到 configure.in 文件中。这似乎有效 - 运行 configure 和 make 的输出显示 nvcc 作为编译器。但是 make 无法使用 CUDA 内核编译源文件,无法识别 CUDA 特定的语法。我不知道为什么,希望这会奏效。

  • 是否可以使用 nvcc 编译源文件,然后在主程序的 make 过程中的链接步骤中包含它?如果是这样,怎么做?(这个问题可能没有意义——我对此真的很生疏)

  • 这样做的正确方法是什么?

  • 有没有一种快速而肮脏的方法可以用于测试目的?

  • 每个人都使用一些秘密工具来设置和理解这些配置和 Makefile 吗?这比我习惯的 Apache Ant 脚本还要糟糕(是的,我不在我的领域)

4

1 回答 1

20

您不需要使用 nvcc 编译所有内容。您猜测您可以使用 NVCC 编译您的 CUDA 代码并保留其他所有内容(链接除外)是正确的。这是我开始使用的方法。

  1. 添加 1 个新标头(例如 myCudaImplementation.h)和 1 个新源文件(扩展名为 .cu,例如 myCudaImplementation.cu)。源文件包含您的内核实现以及(主机)C 包装函数,该函数使用适当的执行配置(aka <<<>>>)和参数调用内核。头文件包含 C 包装函数的原型。让我们调用这个包装函数runCudaImplementation()

  2. 我还将在源文件中提供另一个主机 C 函数(在标题中带有原型),它查询和配置存在的 GPU 设备,如果成功则返回 true,否则返回 false。让我们调用这个函数configureCudaDevice()

  3. 现在,在您通常调用 CPU 实现的原始 C 代码中,您可以执行此操作。

    // must include your new header
    #include "myCudaImplementation.h"
    
    // at app initialization
    // store this variable somewhere you can access it later
    bool deviceConfigured = configureCudaDevice;          
    ...                             
    // then later, at run time
    if (deviceConfigured) 
        runCudaImplementation();
    else
        runCpuImplementation(); // run the original code
    
  4. 现在,由于您将所有 CUDA 代码放在一个新的 .cu 文件中,您只需使用 nvcc 编译该文件。其他一切都保持不变,除了您必须链接到 nvcc 输出的目标文件。例如

    nvcc -c -o myCudaImplementation.o myCudaImplementation.cu <other necessary arguments>
    

然后将 myCudaImplementation.o 添加到您的链接行(类似于:) g++ -o myApp myCudaImplementation.o

现在,如果您有一个使用 configure 的复杂应用程序可以使用并且已经有一个复杂的 makefile,它可能比上述更复杂,但这是一般方法。底线是您不想用 nvcc 编译所有源文件,只需要 .cu 文件。将您的主机编译器用于其他所有内容。

我不是配置专家,因此无法真正提供帮助。您可以运行 configure 来生成一个 makefile,然后编辑该 makefile——这不是一个通用的解决方案,但它会让您开始。

请注意,在某些情况下,您可能还需要将.cu文件的编译与链接分开。在这种情况下,您需要使用 NVCC 的单独编译和链接功能,这篇博文可能会有所帮助

于 2012-02-20T22:31:16.000 回答