如何编译针对Kepler和Maxwell架构的CUDA应用程序?

时间:2015-09-05 00:20:45

标签: cuda nvcc

我在桌面上进行开发,这些桌面有一个Titan X卡(Maxwell架构)。但是,生产代码在具有K40卡(Kepler架构)的服务器上运行。

如何构建我的代码,使其在两个系统上都能以最佳方式运行?

到目前为止,我已经使用了compute_20,sm_20,但我认为此设置并非最佳。

2 个答案:

答案 0 :(得分:4)

您要做的第一件事是构建一个 fat binary ,其中包含sm_35(K40的体系结构)和sm_52的机器代码(SASS)( Titan X的体系结构,以及compute_52的中间代码(PTX),用于未来GPU上的JIT编译。您可以通过-gencode:{/ p>的nvcc开关执行此操作

nvcc -gencode arch=compute_35,code=sm_35 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52

这确保了生成的可执行代码最适合并充分利用每个指定的体系结构。当CUDA驱动程序或运行时在使用特定GPU运行时加载内核时,它将自动选择具有匹配机器代码的版本。

构建胖二进制文件不能做的是调整代码的各种参数,例如内核的启动配置,以便为不同的体系结构提供最佳选择。因此,如果您需要在任一平台上实现最佳性能,您可能需要对应用程序进行概要分析,并根据分析实验的结果考虑特定于机器的源代码调整。

答案 1 :(得分:1)

然而,@ njuffa的answer在语义上是正确的,我想指出一些nvcc的-gencode选项的简写。我们可以缩短:

-gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52

进入这个:

-gencode arch=compute_52,code=\"sm_52,compute_52\"

Nvidia doc中描述了这一点。