繁体   English   中英

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

[英]Sharing information via (c++) openmp between different threads

我对并行编程比较陌生,并且想通过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确保所有线程在代码中到达同一点。

我想在这些对象之间交换更多信息,例如,在每次计算期间都应修改一个整数(或更复杂的对象)“ a”(尽管我无法预测何时和多久一次,但尤其是多于一次)。

该语句有点恼人,因为您应该知道何时需要更新a 这样做时,您需要在所有线程中设置屏障,在关键部分中更新a并继续并行执行。 那么有多少个线程更新a 是主线程还是全部?

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

当然,您意识到, calculate方法无法访问您发布的代码中的变量a 如果您想像这样工作,可以在修改a时内联编写计算函数并使用关键部分:

int a;
#pragma omp parallel
{
   #pragma omp for
   for(int i = 0; i < 4; i++)
   {
       // code of calculate
       #pragma omp critical
       {
           // modify a
       }
       // other code
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM