詹令
lealzhan@126.com
2016.8.20
测试代码
#include <iostream>
#include "omp.h"
int main(void)
{
#pragma omp parallel num_threads(3) //生成线程组,有3个线程
{
//啥都不写,各个线程分别执行以下代码
{
std::cout << "part 0: thread id " << omp_get_thread_num() << std::endl;
}
#pragma omp barrier //等待所有线程执行完
//将for循环划分给各个线程, 可以dynamic或static调度线程
#pragma omp for
for (int i = 0; i < 8; i++)
{
std::cout << "part 1: thread id " << omp_get_thread_num() << " iteration " << i << std::endl;
}
#pragma omp barrier
//将section划分给各个线程
#pragma omp sections
{
#pragma omp section
{
std::cout << "part 2: thread id " << omp_get_thread_num() << " section 0" << std::endl;
}
#pragma omp section
{
std::cout << "part 2: thread id " << omp_get_thread_num() << " section 1" << std::endl;
}
}
#pragma omp barrier
//由单一线程执行
#pragma omp single
{
std::cout << "part 3: thread id " << omp_get_thread_num() << std::endl;
}
#pragma omp barrier
//由master线程执行
#pragma omp master
{
std::cout << "part 4: thread id " << omp_get_thread_num() << std::endl;
}
#pragma omp barrier
}
system("pause");
}
机器配置
八线程
执行结果
线程分配情况
|
0
|
------ fork
| | |
0 1 2 ... part 0
| | |
------ join
|
?
|
------ fork
| | |
0 1 2 ... part 1: for
| | |
------ join
|
?
|
--- fork
| |
0 1 part 2: sections
| |
---- join
|
?
|
--
|
? part 3: single
|
--
|
0 part 4 :master
|
--
|
|
参考
[ ]: OpenMP: OpenMP任务划分与调度 LINK