如何在 CUDA C++ 代码中使用“red”和“atom”PTX 指令?

ein*_*ica 3 c++ cuda atomic instruction-set ptx

CUDA PTX 指南描述了指令“atom”和“red”,它们执行原子和非原子归约。这对我来说是新闻(至少对于非原子归约而言)...我记得不久前学习过如何使用 SHFL 进行归约。这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者使用 C++ 代码访问而无需实际编写 PTX 代码的其他方式?

Rob*_*lla 5

这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者使用 C++ 代码访问而无需实际编写 PTX 代码的其他方式?

这些指令中的大多数都反映在编程指南中描述的原子操作(内置内在函数)中。如果您编译任何这些原子内在函数,您将在生成的代码中找到atom编译red器在 PTX 或 SASS 级别发出的指令。

red当您没有显式使用原子内在函数之一的返回值时,通常会使用指令类型。如果显式使用返回值,则编译器通常会发出该atom指令。

因此,应该清楚的是,该指令本身并不执行完整的经典并行归约,但如果您想依赖原子硬件(和相关限制)来进行归约操作,那么肯定可以用来实现并行归约。这通常不是并行缩减的最快实现。

如果您想直接访问这些说明,通常的建议是在需要时使用内联 PTX

根据要求,以atomicAdd()示例为例进行详细说明:

如果我执行以下操作:

atomicAdd(&x, data);
Run Code Online (Sandbox Code Playgroud)

也许是因为我使用它对设备变量进行典型的基于原子的缩减x,然后编译器会发出一条redPTX)或REDSASS)指令,并获取必要的参数(指向的指针x和变量data,即2个逻辑寄存器)。

如果我执行以下操作:

int offset = atomicAdd(&buffer_ptr, buffer_size);
Run Code Online (Sandbox Code Playgroud)

buffer_size也许是因为我使用它不是为了典型的减少,而是在网格中的各个线程之间共享的缓冲区中保留一个空间( ),该缓冲区具有buffer_ptr到共享缓冲区中下一个可用空间的偏移索引(),然后编译器将发出atom( PTX ) 或ATOM( SASS ) 指令,包括 3 个参数(寄存器中的offset, &buffer_ptr, 和, )。buffer_size

red形式可以由线程/扭曲发出,然后线程/扭曲可以继续,并且通常不会由于该指令问题而停止,该指令问题通常对后续指令没有依赖性。OTOH形式atom意味着修改其 3 个参数之一(3 个逻辑寄存器之一)。因此,随后使用该寄存器中的数据(即内在函数的返回值,即offset在这种情况下)可能会导致线程/扭曲停顿,直到原子硬件实际返回返回值。