在 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 循环?的主要内容,如果未能解决你的问题,请参考以下文章