C++ CUDA中什么更快:全局内存写入+__到全局内存的threadfence()或atomicExch()?

C++ CUDA中什么更快:全局内存写入+__到全局内存的threadfence()或atomicExch()?,c++,cuda,atomic,coalescing,C++,Cuda,Atomic,Coalescing,假设我们有很多线程将按顺序访问全局内存,那么总体上哪个选项执行得更快?我对此表示怀疑,因为_threadfence()考虑了所有共享和全局内存写入,但写入是合并的。另一方面,atomicExch()只考虑了重要的内存地址,但我不知道写入是否合并 代码: array[threadIdx.x] = value; 或 谢谢。在开普勒GPU上,我会打赌原子EXCH,因为原子学在开普勒上非常快。在费米上,这可能是一个清洗,但考虑到没有碰撞,atomicExch仍然可以很好地执行 请做一个实验并报告结果。

假设我们有很多线程将按顺序访问全局内存,那么总体上哪个选项执行得更快?我对此表示怀疑,因为_threadfence()考虑了所有共享和全局内存写入,但写入是合并的。另一方面,atomicExch()只考虑了重要的内存地址,但我不知道写入是否合并

代码:

array[threadIdx.x] = value;


谢谢。

在开普勒GPU上,我会打赌原子EXCH,因为原子学在开普勒上非常快。在费米上,这可能是一个清洗,但考虑到没有碰撞,
atomicExch
仍然可以很好地执行


请做一个实验并报告结果。

这两个做的事情完全不同

atomicExch
确保一次没有两个线程试图修改给定的单元格。如果发生这种冲突,可能会暂停一个或多个线程。如果您事先知道没有两个线程访问同一个单元格,那么就没有必要使用任何
原子…
函数

\uuuu threadfence()
延迟当前线程(并且仅延迟当前线程!),以确保给定线程的任何后续写入实际上都会在以后发生。 因此,
\uuu threadfence()
本身,没有任何后续代码,是不太有趣的

因此,我认为没有必要比较这两种方法的效率。也许如果你能展示一个更具体的用例,我可以讲述


请注意,这两种方法实际上都不能保证线程的实际执行顺序。

可以同时尝试这两种方法并报告结果吗?:)或者,两种方法都试一下,感到惊讶,然后问“为什么ABC比XYZ快这么多?”。。或者,尝试两者,只看到平淡的结果,然后继续前进。
atomicExch(&array[threadIdx.x] , value);