Cuda 在Nvidia的NVCC编译器中使用多个“arch”标志的目的是什么?

Cuda 在Nvidia的NVCC编译器中使用多个“arch”标志的目的是什么?,cuda,nvcc,ptx,Cuda,Nvcc,Ptx,我最近了解了NVCC如何为不同的计算架构编译CUDA设备代码 据我所知,在使用NVCC的-gencode选项时,arch是程序员应用程序所需的最小计算体系结构,也是NVCC的JIT编译器编译PTX代码所需的最小设备计算体系结构 我还了解到,-gencode的代码参数是NVCC完全编译应用程序的计算体系结构,因此不需要JIT编译 在检查了各种CUDA项目Makefiles之后,我注意到以下情况经常发生: -gencode arch=compute_20,code=sm_20 -gencode ar

我最近了解了NVCC如何为不同的计算架构编译CUDA设备代码

据我所知,在使用NVCC的-gencode选项时,arch是程序员应用程序所需的最小计算体系结构,也是NVCC的JIT编译器编译PTX代码所需的最小设备计算体系结构

我还了解到,-gencode的代码参数是NVCC完全编译应用程序的计算体系结构,因此不需要JIT编译

在检查了各种CUDA项目Makefiles之后,我注意到以下情况经常发生:

-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的所有值

这与我们说的有什么区别:

-arch compute_20
-code sm_20
-code sm_21
是自动选择拱门领域中最早的虚拟体系结构,还是存在其他一些模糊的行为

我是否应该知道其他编译和运行时行为


我已经阅读了手册,对于编译或运行时会发生什么,我仍然不清楚。

粗略地说,代码编译流程如下所示:

CUDA C/C++设备源代码->PTX->SASS

虚拟体系结构,如compute_20,由-arch compute指定的任何内容。。。确定将生成何种类型的PTX代码。附加开关(如代码sm_21)确定将生成何种类型的SASS代码。SASS实际上是GPU机器语言的可执行目标代码。一个可执行文件可以包含多个版本的SASS和/或PTX,并且有一个运行时加载机制,可以根据实际使用的GPU选择适当的版本

正如您所指出的,GPU操作的一个方便特性是JIT编译。JIT编译将由GPU驱动程序完成。只要有合适的PTX代码,但没有合适的SASS代码,就不需要安装CUDA工具包。合适的PTX代码的定义在数值上等于或低于运行该代码的目标GPU体系结构。举个例子,指定arch=compute_30、code=compute_30将告诉nvcc在可执行文件中嵌入cc3.0 PTX代码。此PTX代码可用于为GPU驱动程序支持的任何未来体系结构生成SASS代码。目前,这将包括诸如Pascal、Volta、Turing等架构。假设GPU驱动程序支持这些架构

包含多个虚拟体系结构(即PTX的多个版本)的一个优点是,尽管某些设备可能触发JIT编译以创建必要的SAS,但您可以与更广泛的目标GPU设备实现可执行兼容性

包含多个真实GPU目标(即多个SASS版本)的一个优点是,当存在其中一个目标设备时,可以避免JIT编译步骤

如果指定了一组错误的选项,则可能会创建无法在特定GPU上正确运行的可执行文件

指定大量这些选项的一个可能缺点是代码大小膨胀。另一个可能的缺点是编译时间,当您指定更多选项时,编译时间通常会更长

还可以创建不包含PTX的可解释文件,这可能会引起那些试图掩盖其IP的人的兴趣

创建适合JIT的PTX应该通过代码切换来完成。

多拱形标志的目的是使用uuu CUDA_arch_uuu宏进行条件编译,即使用不同优化代码路径的ifdef


请参见此处:

对于迟来的回复表示歉意,并感谢您的回复。我理解让PTX对许多真正的体系结构进行JIT编译的目的,但是是否有必要包括所有这些较旧的PTX体系结构sk,还是只包括最低规格的PTX?例如,如果我想让代码在尽可能多的GPU上运行,我会包括,比如,-arch compute_11,12 13。。。30,35,或者仅仅包括-arch compute_11?最好,James。您可以指定just-arch compute_11,然后生成cc 1.1 PTX代码。现在和将来的所有GPU都应该能够从这个版本的PTX JIT编译成一些有用的机器代码,CC1.0设备除外。但是,通过指定其他PTX版本,您可以通过添加较新的PTX提供更好地利用较新体系结构的机会,因此,如果您还指定了compute_30,那么您的代码可能会在cc3.0设备上运行得更快。这是代码大小/编译时间和最佳性能之间的折衷。您的里程可能会有所不同。不幸的是,我上面的评论不清楚如何生成PTX。请参考我编辑的答案,以反映如何生成
ate PTX适合JIT。有时我会看到arch=compute\u xx后跟code=compute\u xx。这意味着什么?这意味着您正在请求nvcc在可执行对象中嵌入该版本的PTX而不是该版本的SASS。