2

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

4

1 回答 1

4

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

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

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

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

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

根据要求,以atomicAdd()举例说明:

如果我执行以下操作:

atomicAdd(&x, data);

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

如果我执行以下操作:

int offset = atomicAdd(&buffer_ptr, buffer_size);

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

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

于 2016-04-25T21:36:10.910 回答