我最近了解了 NVCC 如何为不同的计算架构编译 CUDA 设备代码。
据我了解,当使用 NVCC 的 -gencode 选项时,“arch”是程序员的应用程序所需的最小计算架构,也是 NVCC 的 JIT 编译器将为其编译 PTX 代码的最小设备计算架构。
我也明白 -gencode 的“代码”参数是 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,但我仍然不清楚编译或运行时会发生什么。