我对并行编程比较新,想要在c++中通过openmp完成以下任务。
我有一些(假设为4个)相对复杂的对象/计算。它们都是类似的,但每个都太复杂了,无法并行化(因此它们运行串行)。所以我的想法是为每个对象/计算使用不同的线程/cpu,也就是说,我想将计算分散到我的核心上。虽然这可能不是在这种情况下最有效的并行使用方法,但由于每个计算的复杂性很高,这可能是最容易实现的方法。
虽然这种方法能够工作,
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
我希望在这些对象之间进一步交换信息,例如一个整数(或更复杂的对象)“a”应该在每次计算期间进行修改(虽然我无法预测何时以及多频繁,但通常情况下会发生多次)。如果它被修改,那么信息也需要被纳入到每个其他计算中。虽然具体的信息交换(再次)相对复杂,但这也是“calculate”方法(隐式地)完成的。总的来说,这应该像上面那样,加上额外的整数“a”,所有计算方法都会读写它:
int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
所以我的问题是,我如何防止在“a”上出现“数据竞争”。这意味着我如何生成一个对象,每次只能被一个线程访问,而不需要在“计算”方法本身中详细说明?OpenMP是否提供此功能,如果没有,哪个库可以提供此功能?
最好的问候和先感谢!