cuda - 用于生成最佳代码的 NVCC 编译选项(使用 JIT)

标签 cuda nvcc

我想了解 nvcc 编译阶段,但我有点困惑。因为我不知道运行我的软件的机器的确切硬件配置,所以我想使用 JIT 编译功能来为它生成尽可能好的代码。在 NVCC 文档中我发现了这个:

“例如,当应用程序在 sm_10、sm_13 甚至更高版本的架构上启动时,下面的命令允许生成完全匹配的 GPU 二进制代码:”

nvcc x.cu -arch=compute_10 -code=compute_10

所以我的理解是,上述选项将为当前 GPU 生成最佳/最快/最佳代码。那是对的吗?我还读到默认的 nvcc 选项是:

nvcc x.cu –arch=compute_10 -code=sm_10,compute_10

如果上述确实正确,为什么我不能在我的应用程序中使用任何 compute_20 功能?

最佳答案

当您指定目标架构时,您将自己限制在该架构中可用的功能。那是因为 PTX 代码是虚拟汇编代码,所以你需要知道 PTX 生成过程中可用的功能。 PTX 将被 JIT 编译为 GPU 二进制代码 (SASS),适用于您运行的任何 GPU,但它无法针对较新的架构功能。

我建议您选择一个最小架构(例如,如果您想要 double ,则为 1.3;如果您想要 Fermi 或更高版本的功能,则为 2.0),然后为该架构和更新的基础架构创建 PTX。您可以在一个命令中执行此操作(尽管它需要更长的时间,因为它需要多次通过代码)并将所有内容捆绑到一个单一的胖二进制文件中。

一个示例命令行可能是:

nvcc <general options> <filename.cu> \
    -gencode arch=compute_13,code=compute_13 \
    -gencode arch=compute_20,code=compute_20 \
    -gencode arch=compute_30,code=compute_30 \
    -gencode arch=compute_35,code=compute_35

这将在二进制文件中创建四个 PTX 版本。您还可以同时编译到选定的 GPU,这具有为您的用户避免 JIT 编译时间的优势,但也会增加二进制文件的大小。

查看 NVCC manual有关这方面的更多信息。

关于cuda - 用于生成最佳代码的 NVCC 编译选项(使用 JIT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23949928/

相关文章:

用于查找表的 CUDA 内存

c++ - 推力结构 vector 的迭代器

c - 如何在 XCODE 5 中使用 CUDA 6.0

visual-studio-2012 - nvcc.exe 链接错误 Microsoft Visual Studio 配置文件 'vcvars64.bat' 找不到

cuda - -use-fast-math 选项是否将 SP 乘法转换为内在函数?

c++ - 为什么我的 cuda 程序在 block 上使用 128 个线程后变得更慢?

java - JCuda : doing parallel arithmetic operations on arrays?

linux - Nvcc 的版本与 CUDA 不同

c - 宏参数不会接受传递的参数(nvcc)

gcc - 我可以让我的编译器在每个函数的基础上使用快速数学吗?