CUDA PTX Guide描述了指令' atom'和' red',执行原子和非原子减少。这对我来说是新闻(至少在非原子减少方面)...我记得前一刻学习how to do reductions with SHFL。这些指令是否以某种方式反映或包装在CUDA运行时API中?或者使用C ++代码可以访问的其他方式而不实际编写PTX代码?
答案 0 :(得分:3)
这些说明是否以某种方式反映或包装在CUDA运行时API中?或者使用C ++代码可以访问的其他方式而不实际编写PTX代码?
这些指令中的大部分都反映在the programming guide中描述的原子操作(内置内在函数)中。如果编译任何这些原子内在函数,您将在生成的代码中找到编译器在PTX或SASS级别发出的atom
或red
指令。
当您没有显式使用来自其中一个原子内在函数的返回值时,通常会使用red
指令类型。如果显式使用返回值,则编译器通常会发出atom
指令。
因此,应该清楚的是,该指令本身并不执行完整的经典并行缩减,但如果您希望依赖原子硬件(及相关限制)来进行缩减操作,则可以使用该指令实现一个。这通常不是并行缩减的最快可能实现。
如果您想直接访问这些说明,通常的建议是在需要时使用inline 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个参数({{1寄存器中的},offset
和&buffer_ptr
。
buffer_size
形式可以由线程/ warp发出,然后由于该指令问题而继续并且通常不会停止,这通常对后续指令没有依赖性。 red
形式OTOH将暗示修改其3个参数之一(3个逻辑寄存器之一)。因此,随后在该寄存器中使用数据(即内部的返回值,在这种情况下为atom
)可能导致线程/ warp停顿,直到原子硬件实际返回返回值。 / p>