gpt4 book ai didi

c++ - 在不同线程之间通过 (c++) openmp 共享信息

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:39 25 4
gpt4 key购买 nike

我对并行编程比较陌生,想通过 openmp 在 C++ 中完成以下任务。

我有一些(比如说 4 个)相对复杂的对象/计算要做。它们都很相似,但太复杂而无法并行化它们(因此它们串行运行)。所以我的想法是为它们中的每一个使用不同的线程/cpu,这意味着我想将计算分散到我的核心上。尽管在这种情况下这可能不是最有效的并行使用方式,但它可能是最容易实现的(因为每次计算都非常复杂)。

虽然这可以通过

#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}

我想在这些对象之间交换更多信息,例如在每次计算期间应该修改一个整数(或更复杂的对象)“a”(虽然我无法预测何时以及多久,但尤其是大多数情况下不止一次).如果修改了,这些信息也需要合并到彼此的计算中。虽然信息的特定交换(再次)相对复杂,但这也是通过“计算”方法(隐含地)完成的。一般来说,这应该像上面那样,带有额外的整数“a”,它被所有计算方法写入和读取:

int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}

所以我的问题是,如何防止“a”上的“数据竞争”?这意味着我如何生成一个对象,每次只能由一个线程访问,而无需在“计算”方法本身中进行详细说明? openmp 是否提供此功能,如果没有,哪个库提供?

提前致以最诚挚的问候和感谢!

最佳答案

从您的描述来看,当每个线程都必须等待 a 的更新信息时,我不确定并行执行是否对您有任何帮助。

无论如何,您可以使用 flushatomiccritical 指令更新变量而不会出现竞争条件。最佳选择在很大程度上取决于哪些线程必须更新 a 或更新 a

critical:所有线程都执行代码,但一次执行一个线程

atomic:内存防止多次写入,并在内部替换为critical

flush:更新共享变量,被critical隐式调用

最后,barrier 确保所有线程都到达代码中的相同点。

I want to exchange further information between this objects, for example an integer (or a more complex object) "a" should be modified during each calculation (though I can not forecast when and how often, but especially mostly more then once).

这个声明有点恼人,因为您应该知道什么时候需要更新的a。当你这样做时,你需要在所有线程中设置一个屏障,在关键部分更新 a 并继续并行执行。那么有多少线程更新a呢?一个主线程还是所有主线程?

如果只有一个线程必须更新a,那么另一种选择是single 指令。它的代码仅由一个线程执行,具有隐式屏障和执行后隐式刷新。这些是将复杂对象 a 正确更新到所有线程的一般选项。祝你好运。

关于c++ - 在不同线程之间通过 (c++) openmp 共享信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8725034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com