在 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?
在 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 single region。如果我没有这个约束,我可以简单地向“omp single”添加一个“nowait”。相反,因为我有没有“nowait”的“omp single”,所以我不希望 block2() 必须等待 block1() 中的“omp single”区域完成。我也不希望 block3() 必须等待 block2() 中的“omp single”区域完成。有任何想法吗?谢谢
最好的解决方案是使用任务。 运行 每个 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
}
}
在 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 single region。如果我没有这个约束,我可以简单地向“omp single”添加一个“nowait”。相反,因为我有没有“nowait”的“omp single”,所以我不希望 block2() 必须等待 block1() 中的“omp single”区域完成。我也不希望 block3() 必须等待 block2() 中的“omp single”区域完成。有任何想法吗?谢谢
最好的解决方案是使用任务。 运行 每个 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
}
}