CUDA中更快的是:全局内存写入+__threadfence()或atomicExch()到全局内存
What is faster in CUDA: global memory write + __threadfence() or atomicExch() to global memory?
假设我们有很多线程将按顺序访问全局内存,那么哪个选项总体上执行得更快?我对此表示怀疑,因为__threadfence()考虑了所有共享和全局内存写入,但写入是合并的。另一方面,atomicExch()只考虑重要的内存地址,但我不知道写入是否合并。
代码中:
array[threadIdx.x] = value;
或
atomicExch(&array[threadIdx.x] , value);
谢谢。
在开普勒GPU上,我会打赌atomicExch
,因为原子学在开普勒上非常快。在费米上,这可能是一次洗涤,但如果没有碰撞,atomicExch
仍然可以表现得很好。
请做一个实验并报告结果。
这两者做的事情截然不同。
atomicExch
确保一次没有两个线程试图修改给定的单元。如果发生这种冲突,一个或多个线程可能会被搁置。如果事先知道没有两个线程访问同一个单元,那么就没有必要使用任何atomic...
函数。
__threadfence()
延迟当前线程(并且仅延迟当前线程!),以确保给定线程的任何后续写入都会在以后发生。因此,__threadfence()
本身在没有任何后续代码的情况下并不是很有趣。
因此,我认为没有必要比较这两者的效率。也许如果你能展示一个更具体的用例,我可以联系。。。
请注意,这两种方法实际上都不能保证线程的实际执行顺序。
相关文章:
- OpenCL 将字符从全局内存复制到本地内存
- 为什么CUDA共享内存比瓷砖矩阵乘法中的全局内存慢
- Opencl-将全局内存工作组+边界转移到本地内存
- Cuda-从设备全局内存复制到纹理内存
- 如何在 CUDA 中正确使用全局内存?
- 是通过计算能力1.x的设备中的缓存的全局内存负载/商店
- 全局内存写入在 CUDA 中是否被视为原子写入
- CUDA中更快的是:全局内存写入+__threadfence()或atomicExch()到全局内存
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 无法使用 CUDA + MATLAB + Visual Studio 检查全局内存
- CUDA 中的全局内存和纹理有什么区别?
- 调用多个内核,全局内存性能 - CUDA
- 将一系列整数写入全局内存的快速(est)方法
- CUDA:全局内存访问地址
- 简单的加法示例:共享内存版本的reduce执行速度比全局内存慢
- 如何将图像从全局内存复制到openCL的本地内存
- CUDA:将全局内存写入和读取与计算能力同步 1.1
- CUDA全局内存
- 如何将全局内存中的数据安全地加载到 CUDA 中的共享内存中
- 在同一全局内存位置并发写入