ein*_*ica 3 c++ cuda atomic instruction-set ptx
CUDA PTX 指南描述了指令“atom”和“red”,它们执行原子和非原子归约。这对我来说是新闻(至少对于非原子归约而言)...我记得不久前学习过如何使用 SHFL 进行归约。这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者使用 C++ 代码访问而无需实际编写 PTX 代码的其他方式?
这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者使用 C++ 代码访问而无需实际编写 PTX 代码的其他方式?
这些指令中的大多数都反映在编程指南中描述的原子操作(内置内在函数)中。如果您编译任何这些原子内在函数,您将在生成的代码中找到atom
编译red
器在 PTX 或 SASS 级别发出的指令。
red
当您没有显式使用原子内在函数之一的返回值时,通常会使用指令类型。如果显式使用返回值,则编译器通常会发出该atom
指令。
因此,应该清楚的是,该指令本身并不执行完整的经典并行归约,但如果您想依赖原子硬件(和相关限制)来进行归约操作,那么肯定可以用来实现并行归约。这通常不是并行缩减的最快实现。
如果您想直接访问这些说明,通常的建议是在需要时使用内联 PTX。
根据要求,以atomicAdd()
示例为例进行详细说明:
如果我执行以下操作:
atomicAdd(&x, data);
Run Code Online (Sandbox Code Playgroud)
也许是因为我使用它对设备变量进行典型的基于原子的缩减x
,然后编译器会发出一条red
(PTX)或RED
(SASS)指令,并获取必要的参数(指向的指针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
在这种情况下)可能会导致线程/扭曲停顿,直到原子硬件实际返回返回值。