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