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

Fab*_*ian 1 cuda nvcc

我在台式机上进行开发,台式机有 Titan X 卡(麦克斯韦架构)。但是,生产代码运行在具有 K40 卡(开普勒架构)的服务器上。

我如何构建我的代码以便它在两个系统上都以最佳方式运行?

到目前为止,我已经使用过,compute_20,sm_20但我认为这个设置不是最佳的。

nju*_*ffa 5

您要做的第一件事是构建一个胖二进制文件,其中包含(sm_35K40sm_52的架构)和(Titan X的架构)的机器代码 (SASS ),以及compute_52用于 JIT 编译的中间代码 (PTX) for未来的 GPU。您可以通过以下-gencode开关执行此操作nvcc

nvcc -gencode arch=compute_35,code=sm_35 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52
Run Code Online (Sandbox Code Playgroud)

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

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