多个线程在同一个全局内存位置写入相同的值

Posted

技术标签:

【中文标题】多个线程在同一个全局内存位置写入相同的值【英文标题】:Several threads writing the same value in the same global memory location 【发布时间】:2011-12-07 13:50:59 【问题描述】:

这个问题和this one密切相关,但我的属于CUDA世界。

我的内核中有几个线程可以在同一个全局内存位置写入完全相同的值。这一直运行良好,但我担心它可能是假的,到目前为止我只是很幸运。

我的工作流程中是否存在内存损坏或意外行为的可能性(由于数据争用、缓存同步等)?

【问题讨论】:

简短的回答是肯定的。如果您绝对必须让多个线程写入同一内​​存,请重新设计您的算法或使用原子内存访问运算符。 我应该在我的算法几乎准备就绪之前问这个问题 :( 没关系,是时候进行一些重新思考和重构了!但很高兴知道原因。 签出:***.com/questions/5953955/threads-concurrent-write @jkysam 很好,我想我的问题现在可以关闭了,几乎完全一样。非常感谢您和 talonmies。 另见:***.com/questions/19946286/… 【参考方案1】:

我的内核中有几个线程可以在同一个全局内存位置写入完全相同的值。

与某些 cmets 不同,这是安全的。安全,我的意思是写入的值将显示在该全局内存位置。不可能不发生写入,也不可能发生其他一些虚假数据损坏。 Tom's answer here 适用于此。

如果写入不同值,则其中一个值将在该位置结束,但未定义哪个值。

【讨论】:

这是我的想法,也是我一直以来的经历。我会按照建议设置这个答案,除非有人想挑战这个。 @Robert Crovella,对于不同的值情况,您提到其中一个值最终会出现在那个位置,但是部分写入呢?

以上是关于多个线程在同一个全局内存位置写入相同的值的主要内容,如果未能解决你的问题,请参考以下文章

多个线程可以安全地同时将相同的值写入同一个变量吗?

在多线程环境中写入时的 Swift 数组复制

如果仅写入值,我是不是需要原子?

其他线程是不是总是以相同的顺序看到不同线程中对同一位置的两次轻松写入?

线程安全

从多个线程写入内存区域会导致争用吗?