【问题标题】:In OpenMP how can we run in parallel multiple code blocks where each block contains omp single and omp for loops?在 OpenMP 中,我们如何并行运行多个代码块,其中每个代码块包含 omp single 和 omp for 循环?
【发布时间】:2021-12-03 21:37:16
【问题描述】:

在 C++ Openmp 中,有人如何并行运行多个代码块,其中每个代码块都包含 omp single 和 omp for 循环? 更准确地说,我有 3 个功能:

block1();
block2();
block3();

我希望这 3 个函数中的每一个都并行运行。但是我不希望这些函数中的每一个都被分配一个线程。如果我希望他们每个人都使用一个线程,我可以将它们包含在三个“#pragma omp single nowait”中,最后是一个“#pragma barrier”。相反,这三个函数中的每一个都可能看起来像这样:

#pragma omp single
{
  //some code here
}

#pragma omp for nowait
for(std::size_t i=0;i<numloops;i++)
{
  //some code here
}

请注意,在上面的代码中,我需要在每个并行 for 循环之前执行一个 omp 单个区域。如果我没有这个限制,我可以简单地在“omp single”中添加一个“nowait”。相反,因为我有没有“nowait”的“omp single”,所以我不希望 block2() 必须等待 block1() 中的“omp single”区域完成。我也不希望 block3() 必须等待 block2() 中的“omp single”区域完成。有任何想法吗?谢谢

【问题讨论】:

    标签: c++ openmp


    【解决方案1】:

    最好的解决方案是使用任务。在不同的任务中运行每个block(),以便它们并行运行:

    #pragma omp parallel
    #pragma omp single nowait
    {
    #pragma omp task
        block1();
    #pragma omp task
        block2();
    #pragma omp task
        block3();
    }
    

    block() 中,您可以设置一些代码,这些代码在for 循环之前执行,您可以使用taskloop 在可用线程之间分配工作。

    void block1()
    {
       //single thread code here
      {
         //.... this code runs before the loop and independent of block2 and block3
      }
    
      #pragma omp taskloop
      for(std::size_t i=0;i<numloops;i++)
      {
        //some code here - this is distributed among the remaining threads
      }
        
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2020-12-20
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多