C++ 如何使用';红色';和';原子';CUDA C和x2B中的PTX指令+;密码?
描述了指令“atom”和“red”,它们执行原子和非原子还原。这对我来说是个新闻(至少在非原子减排方面)。。。我记得不久前学习过。这些指令是否以某种方式反映或包装在CUDA运行时API中?或者其他方式可以用C++代码访问而不必实际编写PTX代码? 这些指令是否以某种方式反映或包装在CUDA运行时API中?或者其他方式可以用C++代码访问而不必实际编写PTX代码? 这些指令中的大多数都反映在中描述的原子操作(内置内部函数)中。如果编译这些原子内部函数中的任何一个,您将在生成的代码中找到编译器在PTX或SASS级别发出的C++ 如何使用';红色';和';原子';CUDA C和x2B中的PTX指令+;密码?,c++,cuda,atomic,instruction-set,ptx,C++,Cuda,Atomic,Instruction Set,Ptx,描述了指令“atom”和“red”,它们执行原子和非原子还原。这对我来说是个新闻(至少在非原子减排方面)。。。我记得不久前学习过。这些指令是否以某种方式反映或包装在CUDA运行时API中?或者其他方式可以用C++代码访问而不必实际编写PTX代码? 这些指令是否以某种方式反映或包装在CUDA运行时API中?或者其他方式可以用C++代码访问而不必实际编写PTX代码? 这些指令中的大多数都反映在中描述的原子操作(内置内部函数)中。如果编译这些原子内部函数中的任何一个,您将在生成的代码中找到编译器在PT
atom
或red
指令
当您不显式使用某个原子内部函数的返回值时,通常会使用red
指令类型。如果显式使用返回值,编译器通常会发出atom
指令
因此,应该清楚的是,该指令本身并不执行完整的经典并行简化,但如果您希望依赖原子硬件(以及相关限制)进行简化操作,则可以使用它来实现一个。这通常不是并行缩减的最快实现
如果您希望直接访问这些说明,通常的建议是在需要的地方使用
根据要求,以以下为例详细说明:
如果我执行以下操作:
atomicAdd(&x, data);
int offset = atomicAdd(&buffer_ptr, buffer_size);
可能是因为我使用它对设备变量x
进行典型的基于原子的简化,那么编译器将发出red
()或red
()指令,其中包含必要的参数(指向x
的指针和变量数据,即2个逻辑寄存器)
如果我执行以下操作:
atomicAdd(&x, data);
int offset = atomicAdd(&buffer_ptr, buffer_size);
也许因为我使用它不是为了一个典型的缩减,而是为了在网格中的各个线程之间共享的缓冲区中保留一个空间(buffer\u size
),它有一个到共享缓冲区中下一个可用空间的偏移索引(buffer\u ptr
),那么编译器将发出一个atom
()或ATOM
()指令,包括寄存器中的3个参数(offset
、&buffer\u ptr
和buffer\u size
)
红色
表单可以由线程/扭曲发出,然后线程/扭曲可能会继续,并且通常不会由于该指令问题而停止,该指令问题通常不会依赖于后续指令。原子形式OTOH将意味着修改它的3个参数之一(3个逻辑寄存器之一)。因此,随后使用该寄存器中的数据(即内在函数的返回值,即本例中的
偏移量)可能会导致线程/扭曲暂停,直到返回值由原子硬件实际返回为止。您是否尝试过查看使用atomicAdd CUDA函数时生成的ptx?我现在不能检查它,但我相信它是那样暴露出来的。尽管如此,我还是对原子与红色的区别感到好奇@talonmies链接似乎说明了这一点。你能详细说明一下当我使用原子内在函数的返回值时,为什么/如何使用red
?或者给出一个(C++代码)示例代码片段?此外,虽然很明显,没有一条指令单独执行并行缩减,但它听起来像是执行了并行缩减的一部分——这在比nvcc使用它的更广泛的上下文中可能会派上用场。