2016-04-25 114 views
2

CUDA PTX Guide描述了指令'atom'和'red',它们执行原子和非原子减少。这对我来说是新闻(至少在非原子减少方面)......我记得早些时候学习how to do reductions with SHFL。这些指令是否反映或以某种方式包装在CUDA运行时API中?或者有些其他方式可以通过C++代码访问,而无需实际编写PTX代码?如何在CUDA C++代码中使用“红色”和“原子”PTX指令?

+0

http://stackoverflow.com/q/34466834/681865 – talonmies

+0

你有没有尝试看看你使用atomicAdd CUDA函数时生成的ptx?我现在无法检查,但我相信它是这样暴露的。尽管如此,我对原子与红色的区别感到好奇。 @talonmies链接似乎说明了它。 –

回答

3

这些指令是反映还是以某种方式包装在CUDA运行时API中?或者有些其他方式可以通过C++代码访问,而无需实际编写PTX代码?

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

当您不明确使用来自某个原子内在函数的返回值时,通常会使用red指令类型。如果明确使用返回值,那么编译器通常会发出​​指令。因此,应该清楚的是,该指令本身并不执行完整的经典并行压缩,但是如果您想依靠原子硬件(以及相关的限制)进行还原操作,肯定可以用来实现一个。这通常不是并行削减的最快实施方案。

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

按照要求,阐述使用atomicAdd()为例:

如果我执行以下步骤:

atomicAdd(&x, data); 

也许是因为我使用它对于典型的基于原子的还原到设备可变x ,则编译器将发出采取必要参数的指令(指向x的指针和变量data,即2个日志ical寄存器)。

如果我执行以下步骤:

int offset = atomicAdd(&buffer_ptr, buffer_size); 

也许是因为我使用它不是一个典型的减少,而是保留之中在网格中,其中有各种线程共享的缓冲器的空间(buffer_size)偏移索引(buffer_ptr)到共享缓冲器中的下一个可用的空间,则编译器将发射一个​​(PTX)或ATOMSASS)指令,包括3个参数(offset&buffer_ptr,和buffer_size,在寄存器中)。

red表格可以由线程/ warp发出,然后由于这个指令问题可能会继续并且不会正常停止,而这个指令问题通常对后续指令没有依赖关系。 OTOH的​​表示修改其3个参数中的一个(3个逻辑寄存器之一)。因此,随后在该寄存器中使用数据(即,在本例中为内部的返回值,即offset)可能导致线程/扭曲停顿,直到实际上由原子硬件返回返回值。

+0

当我使用原子本征的返回值时,您能否详细说明为什么/如何使用'red'?或者,也许给了一个(C++代码)示例代码片段?另外,虽然很明显没有单个指令自己执行并行减少,但它听起来像是执行其中的一部分 - 这可能在比nvcc使用它更广的上下文中派上用场。 – einpoklum

相关问题