OpenMP学习笔记1
介绍
在C/C++中,OpenMP可以通过使用预处理指令来让程序并行化。OpenMP指令使用的格式为:
#pragma omp 指令 [子句[子句]…]
fork/join并行执行模式的概念
OpenMP是一套用于共享内存并行系统的多处理器程序设计的指导性的编译处理方案,OpenMP并行执行的程序要全部结束后才会运行后面非并行部分的代码,这就是fork/join并行模式。
例子:
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
int i;
#pragma omp parallel for
for (i = 0; i < 10; i++) {
printf("i = %d\n", i);
}
printf("hello!\n");
return 0;
}
Linux下编译方式:
gcc -fopenmp test.c -o test
结果为:
i = 8
i = 4
i = 7
i = 6
i = 5
i = 2
i = 9
i = 3
i = 0
i = 1
hello!
OpenMP指令的用法
- parallel指令
parallel 是构造并行块的一个指令,同时也可以配合其他指令如for, sections等指令一起使用。在这个指令后面需要使用一对大括号来指定需要并行计算的代码。
#pragma omp parallel [for | sections] [子句[子句]…]
{
//并行部分
}
- for指令
for指令的作用是使一个for循环在多个线程中执行,一般for指令会与parallel指令同时使用,即parallel for指令。此外还可以在parallel指令的并行块中单独使用,在一个并行块中可以使用多个for指令。但是单独使用for指令是没有效果的。
例子:
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
#pragma omp parallel
{
int i, j;
#pragma omp for
for (i = 0; i < 5; i++)
printf("i = %d,threadid = %d\n", i,omp_get_thread_num());
#pragma omp for
for (j = 0; j < 5; j++)
printf("j = %d,threadid = %d\n", j,omp_get_thread_num());
}
return 0;
}
结果:
i = 0,threadid = 0
i = 1,threadid = 1
i = 4,threadid = 4
i = 3,threadid = 3
i = 2,threadid = 2
j = 2,threadid = 2
j = 0,threadid = 0
j = 1,threadid = 1
j = 4,threadid = 4
j = 3,threadid = 3
- sections和section指令
sections语句可以将下面的代码分成不同的分块,通过section指令来指定分块。每一个分块都会并行执行,具体格式:
#pragma omp [parallel] sections [子句]
{
#pragma omp section
{
//代码
}
…
}
例子:
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
#pragma omp parallel sections
{
#pragma omp section
printf("Section 1 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
printf("Section 2 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
printf("Section 3 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
printf("Section 4 ThreadId = %d\n", omp_get_thread_num());
}
return 0;
}
结果:
Section 3 ThreadId = 18
Section 2 ThreadId = 15
Section 1 ThreadId = 27
Section 4 ThreadId = 23
参考: