Openmp: Section
先前,我们用OpenMP中的for子句可以对循环进行并行。循环里的代码通常是一样的。那么如果想并行运行不同的代码,我们就要使用Section子句。
例子:
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
{
// structured block 1
}
#pragma omp section
{
// structured block 2
}
#pragma omp section
{
// structured block 3
}
...
}
}
parallel
语句创建了线程队,其中的线程都用来并行执行。
sections
语句标记了section结构的开始。这个块里将会包含数个section
结构,每个section
都标记了不同的块,也代表了 一个任务。注意,一定要区分好section
和sections
,这两个有不同的意思。
sections
结构要求不同的section
之间必须独立于其他块,然后每个线程一次执行一个块,每个块仅由一个线程执行一次。
OpenMP并没有规定这些块的执行顺序。如果任务多于线程,一些线程将执行多个块,如果线程多于任务,一些线程将会空闲。
如果parallel
中只有一个sections
块,我们可以将其合并
#pragma omp parallel sections
{
...
}
参看:http://www.openmp.org/mp-documents/openmp-4.5.pdf
Example
void function_1()
{
for (int i = 0; i != 3; i++)
{
std::cout << "Function 1 (i = " << i << ")" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void function_2()
{
for (int j = 0; j != 4; j++)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << " Function 2 "
<< "(j = " << j << ")" << std::endl;
}
}
上面的代码给出了两个函数,我们在函数里实现了打印信息。然后我们用sleep_for
函数来延迟两次迭代之间的打印。
主函数为:
int main()
{
#pragma omp parallel sections
{
#pragma omp section
function_1();
#pragma omp section
function_2();
}
return 0;
}
程序一开始,OpenMP会创建一个线程队(team of threads),然后OpenMp将会分配可用的线程给这两个函数。
如果说线程的数量多于1,那么程序运行就是并行的,如果少于1,程序串行。
程序输出
$ ./ompSection
Function 1 (i = 0)
Function 2 (j = 0)
Function 1 (i = 1)
Function 2 (j = 1)
Function 2 (j = 2)
Function 1 (i = 2)
Function 2 (j = 3)
这是学习的地方