OpenMP概述
1.OpenMP应用编程接口API(Application Programming Interface)是在共享存储体系结构上的一个编程模型。
2.包括编译制导(Compiler Directive)、运行库例程(Runtime Library)和环境变量(Environment Variables)
3.支持增量并行化(Incremental Parallelization)
注意:OpenMP不是建立在分布式存储系统上的/不是在所有的环境下都一样/不是能让多数共享存储器均能有效利用
并行编程模型
基于线程的并行编程模型
Fork-Join并行执行模型
线程分配实例
//gcc -fopenmp -o test xxx.c
#include<stdio.h>
#include"omp.h"
int main ()
{
int nthreads,tid;
int nprocs;
char buf[32];
omp_set_num_threads(8);
/* Fork a team of threads*/
#pragma omp parallel private(nthreads,tid)
{
/* Obtain and print thread id */
tid=omp_get_thread_num();
printf("Hello World from OMP thread %d\n", tid);
/* Only master thread does this */
if (tid==0) {
nthreads = omp_get_num_threads();
printf("Number of threads %d\n", nthreads);
}
}
return 0;
}
编译制导
#pragma omp: 前缀,对所有的OpenMP语句都需要这样的前缀
其作用域:静态扩展(在一个编译制导语句之后被封装到一个结构块中)
孤立语句(一个OpenMP的编译制导语句不依赖于其他的语句)
动态扩展(包括静态范围-for语句 和 孤立语句-sections/critical语句)
共享任务结构(并行for循环/并行sections语句/串行执行):
for编译制导语句
for语句指定紧随它的循环语句必须由线程组并行执行;
语句格式:
#pragma omp for [clause[[,]clause]…] newline
[clause]= Schedule(type [,chunk])
:schedule字句描述如何将循环的迭代划分给线程组中的线程
如果没有指定chunk大小,迭代会尽可能的平均分配给每个线程
type为static,循环被分成大小为chunk的块,静态分配给线程
type为dynamic,循环被动态划分为大小为chunk的块, 动态分配给线程
ordered
private (list)
firstprivate (list)
lastprivate (list)
shared (list)
reduction