我正在尝试了解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功能?
答案 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以获取更多相关信息。