OpenMP的优势,缺点:
优势:
相对简单。不需要显式设置互斥锁,条件变量,数据范围以及初始化。
可扩展。主要是利用添加并行化指令到顺序程序中,由编译器完成自动并行化。
移植性好。OpenMP规范中定义的制导指令、运行库和环境变量,能够使用户在保证程序的可移植性的前提下,按照标准将已有的串行程序逐步并行化,可以在不同的产商提供的共享存储体系结构间比较容易地移植。
缺点:
程序的可维护性不够好
当程序比较复杂的时候,编程会显得比较困难
OpenMP
的支持环境
Intel等的C++和Fortran编译器
Microsoft的Visual Studio 2005
gcc4.2以上版本也宣布对其支持(尚未正式发布)
OpenMP
并行编程模型
基于线程的并行编程模型(Programming Model)
OpenMP使用Fork-Join并行执行模型
OpenMP
程序结构
#include <omp.h>
main (){
int var1, var2, var3;
/*串行执行的代码*/
......
/*OpenMP的编译指导指令*/
#pragmaomp parallel private(var1, var2) shared(var3)
{
/*多个线程并行执行*/
…
/*All threads join master thread and disband*/
}
/*恢复到串行执行*/
…
}
编译制导语句格式
#pragma omp directive_name …
#pragma omp | directive_name | [clause, ...] | newline |
制导指令前缀。对 所有的OpenMP语 句都需要这样的前 缀。 | OpenMP制导指 令。在制导指令前 缀和子句之间必须 有一个正确的 OpenMP制导指 令。 | 子句。在没有其它 约束条件下,子句 可以无序,也可以 任意的选择。 这一 部分也可以没有。 | 换行符。表明这条 制导语句的终止。 |
并行域结构
并行域中的代码被所有的线程执行
具体格式
#pragma omp parallel [clause[[,]clause]…]newline
clause=
if(scalar-expression)
private(list)
firstprivate(list)
default(shared | none)
shared(list)
copyin(list)
reduction(operator: list)
num_threads(integer-expression)
共享任务结构
共享任务结构将它所包含的代码划分给线程组的各成员来执行
并行for循环
并行sections
串行执行