如何编译同时针对 Kepler 和 Maxwell 架构的 CUDA 应用程序?
How can I compile a CUDA application that targets both Kepler and Maxwell Architectures?
我在具有 Titan X 卡(Maxwell 架构)的台式机上进行开发。但是,生产代码在具有 K40 卡(开普勒架构)的服务器上运行。
如何构建我的代码以使其在两个系统上都能以最佳方式运行?
到目前为止,我已经使用了 compute_20,sm_20
,但我认为这个设置不是最佳的。
您要做的第一件事是构建一个 fat 二进制文件,其中包含 sm_35
( K40) 和 sm_52
(Titan X 的架构),加上 compute_52
的中间代码 (PTX),用于在未来的 GPU 上进行 JIT 编译。您可以通过 nvcc
的 -gencode
开关执行此操作:
nvcc -gencode arch=compute_35,code=sm_35 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52
这确保生成的可执行代码最适合并充分利用每个指定的体系结构。当 CUDA 驱动程序或运行时在 运行 特定 GPU 时加载内核时,它会自动 select 具有匹配机器代码的版本。
构建胖二进制文件不会调整代码的各种参数,例如内核的启动配置,以针对不同的体系结构进行优化。因此,如果您需要在任一平台上实现最佳性能,您需要分析应用程序并根据分析实验的结果考虑特定于机器的源代码调整。
然而,@njuffa 的 在语义上是正确的,我想指出一些 shorthand 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 中有描述。
我在具有 Titan X 卡(Maxwell 架构)的台式机上进行开发。但是,生产代码在具有 K40 卡(开普勒架构)的服务器上运行。
如何构建我的代码以使其在两个系统上都能以最佳方式运行?
到目前为止,我已经使用了 compute_20,sm_20
,但我认为这个设置不是最佳的。
您要做的第一件事是构建一个 fat 二进制文件,其中包含 sm_35
( K40) 和 sm_52
(Titan X 的架构),加上 compute_52
的中间代码 (PTX),用于在未来的 GPU 上进行 JIT 编译。您可以通过 nvcc
的 -gencode
开关执行此操作:
nvcc -gencode arch=compute_35,code=sm_35 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52
这确保生成的可执行代码最适合并充分利用每个指定的体系结构。当 CUDA 驱动程序或运行时在 运行 特定 GPU 时加载内核时,它会自动 select 具有匹配机器代码的版本。
构建胖二进制文件不会调整代码的各种参数,例如内核的启动配置,以针对不同的体系结构进行优化。因此,如果您需要在任一平台上实现最佳性能,您需要分析应用程序并根据分析实验的结果考虑特定于机器的源代码调整。
然而,@njuffa 的 -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 中有描述。