在 OpenMP 中,我们如何并行运行多个代码块,其中每个代码块包含 omp single 和 omp for 循环?

Posted

技术标签:

【中文标题】在 OpenMP 中,我们如何并行运行多个代码块,其中每个代码块包含 omp single 和 omp for 循环?【英文标题】:In OpenMP how can we run in parallel multiple code blocks where each block contains omp single and omp for loops? 【发布时间】: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”区域完成。有任何想法吗?谢谢

【问题讨论】:

【参考方案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
  
    

【讨论】:

以上是关于在 OpenMP 中,我们如何并行运行多个代码块,其中每个代码块包含 omp single 和 omp for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MPI 和 OpenMP 运行并行循环

在不同的线程下运行相同的代码有啥意义 - openMP?

如何在 Python 中进行并行编程?

OpenMP:嵌套并行化有啥好处?

在 Openmp (C++) 中销毁线程

OpenMP 并行代码运行速度较慢