gpt4 book ai didi

cuda - 在 Nvidia 的 NVCC 编译器中使用多个 "arch"标志的目的是什么?

转载 作者:行者123 更新时间:2023-12-03 07:59:35 37 4
gpt4 key购买 nike

我最近开始了解 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我仍然不清楚编译或运行时会发生什么。

最佳答案

粗略地说,代码编译流程是这样的:
CUDA C/C++设备代码源--> PTX --> SASS
虚拟架构(例如 compute_20 ,无论 -arch compute... 指定什么)决定将生成什么类型​​的 PTX 代码。附加开关(例如 -code sm_21 )确定将生成什么类型​​的 SASS 代码。 SASS 实际上是 GPU(机器语言)的可执行目标代码。一个可执行文件可以包含多个版本的 SASS 和/或 PTX,并且有一个运行时加载器机制可以根据实际使用的 GPU 选择合适的版本。
正如您所指出的,GPU 操作的一项便利功能是 JIT 编译。 JIT 编译将由 GPU 驱动程序完成(不需要安装 CUDA 工具包),只要有合适的 PTX 代码可用,但合适的 SASS 代码不可用。 “合适的 PTX”代码的定义是在数值上等于或低于运行代码的目标 GPU 架构的代码。选择一个例子,指定 arch=compute_30,code=compute_30会告诉 nvcc 在可执行文件中嵌入 cc3.0 PTX 代码。此 PTX 代码可用于为 GPU 驱动程序支持的任何 future 架构生成 SASS 代码。目前,这将包括 Pascal、Volta、Turing 等架构,假设 GPU 驱动程序支持这些架构。
包含多个虚拟架构(即 PTX 的多个版本)的一个优点是,您可以与更多种类的目标 GPU 设备具有可执行兼容性(尽管某些设备可能会触发 JIT 编译以创建必要的 SASS)。
包含多个“真实 GPU 目标”(即多个 SASS 版本)的优势之一是,当存在这些目标设备之一时,您可以避免 JIT 编译步骤。
如果您指定了一组错误的选项,则可能会创建一个无法(正确)在特定 GPU 上运行的可执行文件。
指定大量这些选项的一个可能的缺点是代码大小膨胀。另一个可能的缺点是编译时间,当您指定更多选项时,编译时间通常会更长。
也可以创建不包含 PTX 的可执行文件,这可能对那些试图隐藏其 IP 的人感兴趣。
创建适用于 JIT 的 PTX 应该由 specifying a virtual architecture 完成为 code转变。

关于cuda - 在 Nvidia 的 NVCC 编译器中使用多个 "arch"标志的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599189/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com