我编写了一个CUDA内核,其中每个线程都对特定的内存地址进行更新(使用int size)。某些线程可能希望同时更新此地址。
CUDA如何处理这个问题?操作是否成为原子?这会以任何方式增加我的应用程序的延迟吗?如果是这样,怎么样?
答案 0 :(得分:6)
操作不会变成原子,它本质上是未定义的行为。当两个或多个线程写入同一位置时,其中一个值将最终位于该位置,但无法预测哪一个。
如果您正在阅读和写作,例如增加变量,这可能会特别成问题。
CUDA提供了一组atomic operations来帮助。
您还可以使用其他编码技术(如并行缩减),以便在对同一位置进行多次更新时提供帮助,例如查找最大值或最小值。
如果您不关心更新的顺序,对于较新的GPU而言,它不应该是性能问题,它会自动将写入或读取压缩到全局内存或共享内存中的单个位置,但这也不是指定的行为。