concurrency - 是否可以为只写操作设置竞争条件?

标签 concurrency cuda gpgpu

如果我有多个线程尝试将相同的值写入内存中的单个位置,是否可能存在竞争条件?数据会在写入过程中以某种方式损坏吗?没有前面的读取或测试条件,只有写入...

编辑:澄清一下,我正在 GPU 上计算点积。我正在使用多个线程来计算单个产品(每行/列元素一个线程)并将它们保存到内存中的临时位置。然后我需要对这些中间产品求和并保存结果。

我正在考虑让所有线程单独执行此求和/存储操作,因为在 GPU 上进行分支会损害性能。 (您会认为无论是由单个线程还是所有线程完成的求和/存储都应该花费相同的时间,但是我已经对此进行了测试,并且性能受到了很小的影响。)所有线程都将获得相同的总和,但是当他们每个人都尝试将答案写入内存中的同一位置时,我担心竞争条件。在我所做的有限测试中,一切似乎都很好,但我仍然很紧张......

最佳答案

根据大多数平台上的大多数线程标准,这只是被禁止或未定义的。也就是说,你不能这样做,如果你这样做,任何事情都可能发生。

像 C 和 C++ 这样的高级语言编译器可以自由地优化代码,前提是您不会做任何不允许做的事情。因此,“只写”操作可能不是这样的事情。如果您用 C 或 C++ 编写 i = 1;,编译器可以自由生成与编写 i = 0; 相同的代码。 i++;。同样令人困惑的优化确实发生在现实世界中。

相反,请遵循您所使用的任何线程模型的规则,以使用适当的同步原语。如果您的平台提供它们,请使用适当的原子操作。

关于concurrency - 是否可以为只写操作设置竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383656/

相关文章:

c++ - OpenCL 仅读取/写入缓冲内存的 1/4,有时会崩溃

multithreading - goroutine 或多线程在 golang 中不起作用

go - 隐藏发送到函数调用后面的 channel 是否安全

java - OO 设计与 Java 中的静态类以及并发开发

visual-studio-2010 - 如何在Windows上轻松编译CUDA代码?

CUDA 链接错误未定义引用

tensorflow - 我已经安装了 CUDA 工具包,为什么 conda 又要安装 CUDA?

graphics - 有没有办法在 Windows 7 系统中独立执行任务并使用异构多 GPU?

java - 带有迭代器的 ConcurrentModificationException

caching - 英伟达 CUDA : cache L2 and multiple kernel invocations