cuda的虚拟和真实架构之间的差异

Hai*_*ang 9 cuda nvcc

试图理解cuda的虚拟和真实架构之间的差异,以及不同的配置如何影响程序的性能,例如

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
...
Run Code Online (Sandbox Code Playgroud)

NVCC手册中给出了以下说明,

GPU编译通过中间表示PTX([...])执行,可以将其视为虚拟GPU架构的程序集.与实际的图形处理器相反,这种虚拟GPU完全由它提供给应用程序的一组功能或特征来定义.特别地,虚拟GPU架构提供(大部分)通用指令集,并且二进制指令编码不是问题,因为PTX程序总是以文本格式表示.因此,nvcc编译命令总是使用两种体系结构:用于指定虚拟中间体系结构的计算体系结构,以及用于指定要执行的目标处理器的真实GPU体系结构.要使这样的nvcc命令有效,真实体系结构必须是虚拟体系结构的实现(某种程度或另一种).这将在下面进一步解释.所选择的虚拟架构更多地是关于应用程序所需的GPU功能的声明:使用最小的虚拟架构仍然允许第二个nvcc阶段的最广泛的实际架构.相反,指定提供应用程序未使用的功能的虚拟体系结构会不必要地限制可在第二个nvcc阶段中指定的可能GPU集.

但仍然不太明白性能会受到不同配置的影响(或者,可能只会影响物理GPU设备的选择?).特别是,这句话对我来说最让人困惑:

特别地,虚拟GPU架构提供(大部分)通用指令集,并且二进制指令编码不是问题,因为PTX程序总是以文本格式表示.

Gre*_*ith 6

NVIDIA CUDA编译器驱动NVCC上用户指南第GPU编译提供虚拟和物理体系结构的非常彻底的描述和概念是如何在构建过程中使用.

虚拟体系结构指定代码所针对的功能集.下表列出了虚拟架构的一些演变.编译时,应指定具有足够功能集的最低虚拟体系结构,以使程序能够在最广泛的物理体系结构上执行.

虚拟架构功能列表(来自用户指南)

compute_10   Basic features
compute_11   + atomic memory operations on global memory
compute_12   + atomic memory operations on shared memory
             + vote instructions
compute_13   + double precision floating point support
compute_20   + Fermi support
compute_30   + Kepler support
Run Code Online (Sandbox Code Playgroud)

物理体系结构指定了GPU的实现.这为编译器提供了指令集,指令延迟,指令吞吐量,资源大小等,以便编译器可以最佳地将虚拟体系结构转换为二进制代码.

可以为编译器指定多个虚拟和物理体系结构对,并让编译器将最终的PTX和二进制文件备份到单个二进制文件中.在运行时,CUDA驱动程序将为安装的物理设备选择最佳表示形式.如果fatbinary中没有提供二进制代码,则驱动程序可以运行JIT最佳PTX实现.