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

时间:2012-07-20 19:57:01

标签: c++ cuda atomic coalescing

假设我们有许多线程可以按顺序访问全局内存,哪个选项在整体中执行得更快?我有点怀疑,因为__threadfence()会考虑所有共享和全局内存写入,但写入会被合并。另一方面,atomicExch()仅考虑重要的内存地址,但我不知道写入是否合并。

在代码中:

array[threadIdx.x] = value;

或者

atomicExch(&array[threadIdx.x] , value);

感谢。

2 个答案:

答案 0 :(得分:2)

在Kepler GPU上,我敢打赌atomicExch因为Kepler上的原子非常快。在费米,它可能是一个洗,但鉴于你没有碰撞,atomicExch仍然可以表现良好。

请进行实验并报告结果。

答案 1 :(得分:0)

这两个人做的事情非常不同。

atomicExch确保没有两个线程一次尝试修改给定的单元格。如果发生此类冲突,则可能会停止一个或多个线程。如果您事先知道没有两个线程访问同一个单元格,则没有必要使用任何atomic...函数。

__threadfence()延迟当前线程(并且只有当前线程!)以确保给定线程的任何后续写入确实在以后发生。 因此,__threadfence()本身没有任何后续代码也不是很有趣。

出于这个原因,我认为没有必要比较这两者的效率。也许如果你能展示一些更具体的用例我可以联想......

请注意,这些实际上都没有对线程的实际执行顺序提供任何保证。