atomicAdd处理显存时是否也要注意合并对齐

多线程同时对global memory原子操作时,是否也要注意128B(计算能力3.x时)的字节对齐问题?

LZ您好,手册中似乎没有提及这个事情,我来估计一下,仅代表个人观点:

1:如果是多个线程向同一个地址进行atomic操作,那么似乎无所谓是否是对齐的,因为每次都是对同一个位置的4B(以float为例)读写。

2:如果是多个线程对多个地址进行atomic操作,假定一个warp对连续的一段地址进行atomic操作,之后下一个warp再对这一段地址操作,同一个warp里面没有对同一个地址atomic操作。此时,考虑到毕竟要先进行读取操作,最后又要进行写入操作,如果没有对齐,可能会此时的访存效率会下降。但是考虑到atomic本身是比较慢的,可能花费的时间主要在atomic操作本身,不过我没有详细测试过。

3:一个warp内部对多个地址进行atomic操作,但是有多个线程对同一个地址操作,此时,对同一地址atomic操作的线程是强制为串行的,他们会拖慢整个warp。极端情况,一个warp对同一个地址atomic操作,就变得完全串行。当然这一点只是附带说明,和您的问题“是否需要128B对齐”没有直接关系。

大致如上,仅供参考,欢迎讨论/指正。

祝您编码愉快~

您可以黑用的。不用担心这些。注意好您的逻辑上的正确性即可。

因为往往这不是你可以选择的问题,而是受限于您的逻辑需要。您可以详细参考2楼的解释。

谢谢。ICE版主的回答。

可以理解为在没有冲突的情况下,单block中较多的线程并行原子加显存的效率更高些对吗?

您可以这么理解。

谢谢版主热心回答。
随便再请教下,能不能对零拷贝内存(cudaHostAllocMapped)进行原子操作。

楼主您好,可以这么做。
但需要注意的是,原子操作不会和host端的其他读写维持一致性。请小心。
(您可以只在kernel里atomic*()就安全了)

要是多gpu原子加零拷贝内存安全吗?

这个手册没有提到,我也没有试验过,但根据个人看法,应该是不安全的。仅供参考:

因为操作序列“从PCI-E读取,改变,从PCI-E回写到host memory"这个过程可能被2个GPU彼此竞争,交错。

好的。非常感谢版主的回答。:3_48: