OpenMP - 编译制导(三)- ordered、master、barrier
ordered制导
ordered语句用于指定并行区域的循环迭代按串行顺序执行。这通常用于那些需要按照特定顺序执行的代码部分,以确保数据的正确性和一致性。ordered指令通常与for或parallel for一起使用,并且必须与#pragma omp ordered子句结合使用。在使用ordered语句时,被标记为ordered的代码块将会按照线程顺序执行,即每个线程按照它们创建的顺序执行。这意味着,即使并行执行,也会保持与串行执行相同的指令顺序。
注:除了被ordered标记的代码块外,循环中的其他部分可以在不同的线程中并行执行,不需要等待顺序执行的部分完成。
#include <iostream>
#include <omp.h>
using namespace std;
// #pragma omp for ordered指令用于指定for循环中的迭代应该按照顺序执行。
// #pragma omp ordered指令用于标记需要按照顺序执行的代码块
int main(int argc, char* argv[]){
int d[6];
#pragma omp parallel for ordered
for (int i = 0; i < 6; ++i) {
#pragma omp ordered
{
cout << "thread " << omp_get_thread_num() << " [" << i <<"]" << endl;
}
}
return 0;
}
ordered
thread 0 [0]
thread 0 [1]
thread 1 [2]
thread 1 [3]
thread 2 [4]
thread 3 [5]
non ordered
thread thread thread 02 [4] [0]1 [2]
thread 0 [1]
thread 1 [3]
thread 3 [5]
master制导
#pragma omp master 用于标记一个代码块,该代码块中的指令只会由主线程执行,而其他线程则会跳过这部分代码。这通常用于执行只需要由一个线程执行的初始化工作或收集结果、IO等操作。
#include <iostream>
#include <omp.h>
using namespace std;
int main(int argc, char* argv[]){
int sum = 0;
#pragma omp parallel
{
int id = omp_get_thread_num();
#pragma omp master
{
cout << "master thread id is " << id << endl;
}
sum += id;
}
cout << "sum = " << sum << endl;
return 0;
}
master
master thread id is 0
sum = 6
barrier制导
#pragma omp barrier 是一个同步指令,它用于在并行区域中所有的线程都达到该位置时创建一个同步点。在该同步点之前的所有操作都必须在所有线程都完成之前完成,而在该同步点之后的操作则可以在所有线程到达之后进行。在for、sections和single制导后,有一个隐式barrier存在。
#include <iostream>
#include <omp.h>
using namespace std;
int main(int argc, char *argv[]) {
#pragma omp parallel
{
int id = omp_get_thread_num();
cout << "thread " << id << " before barrier" << endl;
#pragma omp barrier
cout << "thread " << id << " after barrier" << endl;
}
return 0;
}
barrier
Thread Thread Thread 2 before barrier01 before barrier before barrier
Thread 3 before barrier
Thread 0 after barrier
Thread 2 after barrier
Thread 3 after barrierThread
1 after barrier
。。。

浙公网安备 33010602011771号