CUDA PTX 指南描述了指令“ atom”和“red”,它们执行原子和非原子缩减。这对我来说是个新闻(至少在非原子减少方面)......我记得不久前学习如何使用 SHFL 进行减少。这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者在不实际编写 PTX 代码的情况下使用 C++ 代码访问的其他方式?
1 回答
这些指令是否以某种方式反映或包装在 CUDA 运行时 API 中?或者在不实际编写 PTX 代码的情况下使用 C++ 代码访问的其他方式?
这些指令中的大多数都反映在编程指南中描述的原子操作(内置内在函数)中。如果您编译任何这些原子内在函数,您将在生成的代码中找到编译器在 PTX 或 SASS 级别发出的指令atom
。red
当red
您没有显式使用来自原子内在函数之一的返回值时,通常会使用指令类型。如果显式使用返回值,则编译器通常会发出atom
指令。
因此,应该清楚的是,这条指令本身并不执行完整的经典并行归约,但如果您想依赖原子硬件(和相关限制)进行归约操作,当然可以使用它来实现。这通常不是并行归约的最快实现方式。
如果您想直接访问这些说明,通常的建议是在需要的地方使用内联 PTX。
根据要求,以atomicAdd()
举例说明:
如果我执行以下操作:
atomicAdd(&x, data);
也许是因为我将它用于典型的基于原子的设备变量缩减x
,然后编译器会发出一个red
(PTX)或RED
(SASS)指令,采用必要的参数(指向x
和变量的指针data
,即2个逻辑寄存器)。
如果我执行以下操作:
int offset = atomicAdd(&buffer_ptr, buffer_size);
也许是因为我使用它不是为了进行典型的缩减,而是buffer_size
在网格中的各个线程之间共享的缓冲区中保留一个空间 (),该缓冲区具有buffer_ptr
指向共享缓冲区中下一个可用空间的偏移索引 (),然后是编译器将发出atom
( PTX ) 或ATOM
( SASS ) 指令,包括 3 个参数(寄存器中的offset
,&buffer_ptr
和buffer_size
, )。
该red
表格可以由线程/经线发出,然后线程/经线可能会继续并且通常不会由于该指令问题而停止,该指令问题通常与后续指令没有依赖性。OTOH 形式将atom
暗示修改其 3 个参数之一(3 个逻辑寄存器之一)。因此,随后使用该寄存器中的数据(即内在函数的返回值,即offset
在这种情况下)可能导致线程/扭曲停止,直到返回值由原子硬件实际返回。