【发布时间】:2015-10-14 05:07:49
【问题描述】:
我正在尝试使用 OpenMP 实现并行算法。 原则上,我应该有许多线程以异步方式写入和读取共享向量的不同组件。 有一个 FOR 循环,其中线程循环,当线程在循环的行 A 中时,它写入共享向量的随机分量,而当它在行 B 中时,它读取循环的随机分量相同的共享向量。 一个线程可能会尝试读取共享向量的一个组件,而该组件是由另一个线程编写的。 如何避免不一致?
我阅读了有关锁和临界区的信息,但我认为这不是解决方案。例如,我可以围绕线程在共享向量中写入的 A 行设置锁定,但是如果 B 行中的线程同时尝试读取该组件,这是否可以防止不一致?
【问题讨论】:
-
向量不是线程安全的,因此您的数据竞争情况可能会发生。我认为最好的解决方案(如果可能的话)是将向量简单地分成多个部分并将这些部分分配给不同的线程。这样,您就不需要任何锁或原子,因为每个线程都有自己的个人向量子部分。
-
“假设循环的 A 行它写在共享向量的随机分量上,而当它在 B 行时,它读取同一共享向量的随机分量”:与可能的不一致,您的算法对此有弹性吗?我的意思是,对“共享向量的随机分量”进行读写操作的顺序是否会对最终结果产生严重影响?如果是的话,也许你的算法毕竟不是可并行的(这种方式)。如果没有,可能有一个解决方案。只需发布一个有效的顺序版本,我们就会看到。
-
请显示minimal but working example of what you want to do。至少显示标量代码。
标签: c++ multithreading parallel-processing synchronization openmp