我在桌面上进行开发,这些桌面有一个Titan X卡(Maxwell架构)。但是,生产代码在具有K40卡(Kepler架构)的服务器上运行。
如何构建我的代码,使其在两个系统上都能以最佳方式运行?
到目前为止,我已经使用了compute_20,sm_20
,但我认为此设置并非最佳。
答案 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)