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

时间:2014-05-30 08:11:55

标签: 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功能?

1 个答案:

答案 0 :(得分:3)

当您指定目标体系结构时,您将限制自己使用该体系结构中可用的功能。这是因为PTX代码是虚拟汇编代码,因此您需要了解PTX生成期间可用的功能。对于您运行的任何GPU,PTX将被JIT编译为GPU二进制代码(SASS),但它无法定位更新的架构功能。

我建议你选择一个最小的架构(例如,如果你想要双精度,则为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以获取更多相关信息。