我对于并行编程相对较新,希望通过openmp完成C++中的以下任务。通过不同线程之间的(C++)openmp共享信息
我有一些(可以说4)相对复杂的对象/计算要做。它们都是相似的,但是太复杂以致无法并行化每一个(所以它们运行串行)。所以我的想法是为它们中的每一个使用不同的线程/ CPU,这意味着我想将计算分摊到我的核心上。尽管在这种情况下这可能不是最有效的并行性用法,但它可能是最容易实现的(因为每个计算的高复杂度)。
虽然这由
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
欲这个对象之间交换的信息,例如一个整数(或更复杂的对象)的工作“一个”应被每个计算过程中修改(虽然我可以不预测何时和多少次,但尤其多于一次)。如果它被修改,那么这些信息也需要并入其他计算中。尽管信息的具体交换(再次)是相对复杂的,但这也是通过“计算”方法(隐含地)完成的。一般来说,这应该看起来像上面,如果加上整数“一”,这是所有的计算方法写和读:
int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
所以我的问题是,如何防止“数据种族”在“一”?这意味着我怎样才能生成一个对象,每次只能由一个线程访问,而不用在“计算”方法本身中详细讨论? openmp是否提供了这个功能,如果没有,这个库是用来做什么的?
此致敬意!
锁定'一个'的整个时间任何计算将需要它是相当简单的,但这将有效地序列化您的计算,是吗?你所有的计算都能够通过另一个线程异步改变可能复杂的'a'(我怀疑不是!)吗?如果不是,是否可以在每个计算中确定哪些点是安全的,以便他们接受新的'a'?如果他们在某个中间点接受新的'a',这是否会使计算运行的结果无效? – 2012-01-04 10:30:23
我不确定我是否了解您的评论。计算可能是“长”(最多几天),“a”具有额外的特性,关于“更新”的知识可能会节省相当长的时间,但功能并不需要。所以检查一个新的“a”会经常重复,但大部分时间都会消极(没有新的“a”)。所以一个“旧”“一个”不会造成伤害,但是一个错误(异步?)会。在我看来,问题在于从一个线程修改“a”,而从另一个线程读取。 – Martin 2012-01-04 10:47:12
我的问题在于理解如何改变参数(即使'干净'地完成'原子'来改变'a'),在计算的某个中间阶段和未知阶段可能会导致任何问题 - 一些计算将与旧的'a'和一些新的'a'一起完成 - 对我来说,这将是一件坏事。然而,你的回复标志着一些重要的信息 - 计算要求在适当的时候提供一个新的'a'(尽管如果现在没有'a'可用,请求可能会被拒绝)。这使事情变得更容易。 – 2012-01-04 11:03:23