假设我们有许多线程可以按顺序访问全局内存,哪个选项在整体中执行得更快?我有点怀疑,因为__threadfence()会考虑所有共享和全局内存写入,但写入会被合并。另一方面,atomicExch()仅考虑重要的内存地址,但我不知道写入是否合并。
在代码中:
array[threadIdx.x] = value;
或者
atomicExch(&array[threadIdx.x] , value);
感谢。
答案 0 :(得分:2)
在Kepler GPU上,我敢打赌atomicExch
因为Kepler上的原子非常快。在费米,它可能是一个洗,但鉴于你没有碰撞,atomicExch
仍然可以表现良好。
请进行实验并报告结果。
答案 1 :(得分:0)
这两个人做的事情非常不同。
atomicExch
确保没有两个线程一次尝试修改给定的单元格。如果发生此类冲突,则可能会停止一个或多个线程。如果您事先知道没有两个线程访问同一个单元格,则没有必要使用任何atomic...
函数。
__threadfence()
延迟当前线程(并且只有当前线程!)以确保给定线程的任何后续写入确实在以后发生。
因此,__threadfence()
本身没有任何后续代码也不是很有趣。
出于这个原因,我认为没有必要比较这两者的效率。也许如果你能展示一些更具体的用例我可以联想......
请注意,这些实际上都没有对线程的实际执行顺序提供任何保证。