试图了解 cuda 的虚拟和真实架构之间的差异,以及不同的配置将如何影响程序的性能,例如
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
...
NVCC手册中给出了以下解释,
GPU 编译是通过中间表示 PTX ([...]) 执行的,它可以被视为虚拟 GPU 架构的组装。与实际的图形处理器相反,这样的虚拟 GPU 完全由它提供给应用程序的一组能力或特性来定义。特别是,虚拟 GPU 架构提供(大部分)通用指令集,并且二进制指令编码不是问题,因为 PTX 程序总是以文本格式表示。因此,一个 nvcc 编译命令总是使用两种架构:一个计算架构来指定虚拟中间架构,以及一个真正的 GPU 架构来指定要在其上执行的预期处理器。要使这样的 nvcc 命令有效,真正的架构必须是虚拟架构的实现(以某种方式)。这将在下面进一步解释。选择的虚拟架构更多地是对应用程序所需的 GPU 功能的说明:使用最小的虚拟架构仍然允许第二个 nvcc 阶段使用最广泛的实际架构。相反,指定一个提供应用程序未使用的功能的虚拟架构会不必要地限制可以在第二个 nvcc 阶段指定的可能 GPU 集。使用最小的虚拟架构仍然允许第二个 nvcc 阶段使用最广泛的实际架构。相反,指定一个提供应用程序未使用的功能的虚拟架构会不必要地限制可以在第二个 nvcc 阶段指定的可能 GPU 集。使用最小的虚拟架构仍然允许第二个 nvcc 阶段使用最广泛的实际架构。相反,指定一个提供应用程序未使用的功能的虚拟架构会不必要地限制可以在第二个 nvcc 阶段指定的可能 GPU 集。
但仍然不太了解不同配置对性能的影响(或者,可能只影响物理 GPU 设备的选择?)。特别是,这句话让我最困惑:
特别是,虚拟 GPU 架构提供(大部分)通用指令集,并且二进制指令编码不是问题,因为 PTX 程序总是以文本格式表示。