gpt4 book ai didi

CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE

转载 作者:行者123 更新时间:2023-12-02 09:43:03 50 4
gpt4 key购买 nike

我仍然不确定在使用 nvcc 构建时如何正确指定代码生成的体系结构。我知道我的二进制文件中嵌入了机器代码和 PTX 代码,并且可以通过 Controller 开关 -code 进行控制。和-arch (或使用 -gencode 两者的组合)。

现在,根据 this除了两个编译器标志之外,还有两种指定体系结构的方法: sm_XXcompute_XX ,其中compute_XX指虚拟和 sm_XX到一个真正的建筑。旗帜-arch仅采用虚拟架构的标识符(例如 compute_XX ),而 -code flag 接受真实架构和虚拟架构的标识符。

文档指出 -arch指定为其编译输入文件的虚拟体系结构。然而,这个 PTX 代码不会自动编译为机器代码,但这只是一个“预处理步骤”。

现在,-code应该指定 PTX 代码针对哪些架构进行汇编和优化。

但是,尚不清楚二进制文件中将嵌入哪种 PTX 或二进制代码。例如,如果我指定 -arch=compute_30 -code=sm_52 ,这是否意味着我的代码将首先编译为功能级别 3.0 PTX,然后从中创建功能级别 5.2 的机器代码?将嵌入什么?

如果我只是指定 -code=sm_52那么会发生什么?仅嵌入由 V5.2 PTX 代码创建的 V5.2 机器代码?与 -code=compute_52 有什么区别? ?

最佳答案

一些相关问题/答案是herehere .

I am still not sure how to properly specify the architectures for code generation when building with nvcc.

完整的描述有些复杂,但其目的是相对简单、易于内存的规范用法。针对代表您希望定位的 GPU 的架构(虚拟和真实)进行编译。一个相当简单的形式是:

-gencode arch=compute_XX,code=sm_XX

其中 XX 是您希望定位的 GPU 的两位数计算能力。如果您希望定位多个 GPU,只需对每个 XX 目标重复整个序列即可。这大约是 CUDA 示例代码项目所采用的方法。 (如果您想在可执行文件中包含 PTX,请包含一个额外的 -gencodecode 选项,指定与 arch 选项相同的 PTX 虚拟架构)。

另一种相当简单的形式,当仅针对单个 GPU 时,只需使用:

-arch=sm_XX 

与 XX 的描述相同。此表单将包括指定架构的 SASS 和 PTX。

Now, according to this apart from the two compiler flags there are also two ways of specifying architectures: sm_XX and compute_XX, where compute_XX refers to a virtual and sm_XX to a real architecture. The flag -arch only takes identifiers for virtual architectures (such as compute_XX) whereas the -code flag takes both, identifiers for real and for virtual architectures.

arch 时,这基本上是正确的和code用作 -gencode 内的子开关开关,或者如果两者一起使用,如您所描述的那样独立。但是,例如,当-arch时单独使用(不带 -code ),它代表另一种“速记”符号,在这种情况下,您可以传递一个真实的架构,例如 -arch=sm_52

However, it is not clear which PTX or binary code will be embedded in the binary. If I specify for example -arch=compute_30 -code=sm_52, does that mean my code will first be compiled to feature level 3.0 PTX from which afterwards machine code for feature level 5.2 will be created from? And what will be embedded?

嵌入内容的确切定义因使用形式而异。但对于这个例子:

-gencode arch=compute_30,code=sm_52

或者对于您确定的等效情况:

-arch=compute_30 -code=sm_52

那么是的,这意味着:

  1. 将从您的源代码生成临时 PTX 代码,它将使用 cc3.0 PTX。
  2. 从该 PTX 中,ptxas工具将生成符合 cc5.2 标准的 SASS 代码。
  3. SASS 代码将嵌入到您的可执行文件中。
  4. PTX 代码将被丢弃。

(我不确定为什么您实际上会指定这样的组合,但它是合法的。)

If I just specify -code=sm_52 what will happen then? Only machine code for V5.2 will be embedded that has been created out of V5.2 PTX code? And what would be the difference to -code=compute_52?

-code=sm_52将从中间 PTX 代码生成 cc5.2 SASS 代码。 SASS 代码将被嵌入,PTX 将被丢弃。请注意,以这种形式单独指定此选项,不带 -arch选项,将是非法的。 (1)

-code=compute_52将(仅)生成 cc5.x PTX 代码并将该 PTX 嵌入到可执行文件/二进制文件中。请注意,以这种形式单独指定此选项,不带 -arch选项,将是非法的。 (1)

cuobjdump tool可用于识别给定二进制文件中到底包含哪些组件。

(1) 当没有 -gencode 时使用开关,没有-arch使用开关,nvcc假定默认 -arch=sm_20附加到您的编译命令中(这是针对 CUDA 7.5,默认 -arch 设置可能会因 CUDA 版本而异)。 sm_20是一个真实架构,并且在-arch上指定一个真实架构是不合法的。当 -code 时的选项还提供了选项。

关于CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35656294/

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