【发布时间】:2013-07-10 01:37:52
【问题描述】:
我最近开始了解 NVCC 如何为不同的计算架构编译 CUDA 设备代码。
据我了解,在使用 NVCC 的 -gencode 选项时,“arch”是程序员应用程序所需的最小计算架构,也是 NVCC 的 JIT 编译器将为其编译 PTX 代码的最小设备计算架构。
我也明白-gencode的“code”参数是NVCC完全编译应用程序的计算架构,因此不需要JIT编译。
在检查了各种 CUDA 项目的 Makefile 后,我注意到以下情况经常发生:
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
经过一番阅读,我发现可以在一个二进制文件中编译多个设备架构 - 在本例中为 sm_20、sm_21。
我的问题是为什么需要这么多拱/代码对?上面的“arch”的值都是用的吗?
那和说有什么区别:
-arch compute_20
-code sm_20
-code sm_21
“arch”字段中最早的虚拟架构是自动选择的,还是有其他一些晦涩的行为?
还有其他我应该注意的编译和运行时行为吗?
我已阅读手册 http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation,但我仍然不清楚编译或运行时会发生什么。
【问题讨论】: