【问题标题】:How to escape from a loop's team of task?如何逃离循环的任务团队?
【发布时间】:2011-11-01 04:50:26
【问题描述】:

我有两种工作要做,foobar1 要并行完成 3 次,foobar2 要并行完成 5 次。 我的想法是让主线程创建这两个工作组。但我面临一个困难。

是否可以让线程从并行循环中逃脱?我的意思是实现这样的代码,主任务可以 逃离第一组的工作创建第二组

#pragma omp parallel num_threads(8)
{
    // first team of task which will execute the foobar1 function in parallel

    #pragma omp for schedule(static,1) nowait 
    for(i = 0; i < 3; i++)
    {
        #pragma omp master
        {
            //escape here to create a second team in parallel
        }

        foobar1();
    }

    // second team of task which will execute the foobar2
    #pragma omp for schedule(static,1) nowait
    for(j = 0; j < 5; j++)
    {
        foobar2();
    }
}

【问题讨论】:

  • 您是否尝试拆分 8 个线程,以便 3 个运行第一个循环,5 个运行第二个循环?
  • @Mysticial,是的,这正是我想要的。

标签: c loops parallel-processing openmp


【解决方案1】:

这是一种完全绕过您的问题的(干净的)方法:

#pragma omp parallel for num_threads(8)
for(i = 0; i < 8; i++)
{
    if (i < 3){
        foobar1();
    }else{
        foobar2();
    }
}

如果这不合适,那么我想到的另一个解决方案是使用嵌套并行。但这很混乱。

【讨论】:

  • @Mystical,感谢您的回答,现在想象一下foobar2 内容嵌套循环的情况。是否有可能这里可用的 8 个线程中的一些可以在 foobar2 函数的嵌套循环中工作?非常感谢您的宝贵时间
  • 你可能会让它的一些线程“掉线”到内部循环。但如果没有示例,我不确定您的意思是什么——作为一个单独的问题可能更好。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2021-05-01
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多