我如何利用“红色”'和'原子' CUDA C ++代码中的PTX指令?

时间:2016-04-25 19:43:44

标签: c++ cuda atomic isa ptx

CUDA PTX Guide描述了指令' atom'和' red',执行原子和非原子减少。这对我来说是新闻(至少在非原子减少方面)...我记得前一刻学习how to do reductions with SHFL。这些指令是否以某种方式反映或包装在CUDA运行时API中?或者使用C ++代码可以访问的其他方式而不实际编写PTX代码?

1 个答案:

答案 0 :(得分:3)

  

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

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

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

因此,应该清楚的是,该指令本身并不执行完整的经典并行缩减,但如果您希望依赖原子硬件(及相关限制)来进行缩减操作,则可以使用该指令实现一个。这通常不是并行缩减的最快可能实现。

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

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

如果我执行以下操作:

atomicAdd(&x, data);

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

如果我执行以下操作:

int offset = atomicAdd(&buffer_ptr, buffer_size);

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

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