OpenMP应该是历史比较悠久的并行工具吧,至少我最早知道的是它,做为共享存储标准,它是为多处理器多核心的设备上编写并行程序而设计的一个应用编程接口,包括一套编译知道语言和一个支持它的函数库。
上述都是比较官方的话语,对我而言,它有两个优势:其一为可结合标准的C/C++(外加Fortran)进行工做,而且基本应用较为简单,易于学习(仅限于皮毛);其二为支持跨平台,VS中可经过编辑属性直接开启此功能,Linux只要包含头文件就能够了,支持gcc,g++编译器,这也就下降了安装配置的难度。编程
简单介绍下OpenMP编译指导语句:函数
除此以外,还有几个比较关键的函数:工具
OpenMP中,标准的并行模式为fork/join模式,简单将就是只有一个主线程(通常是按照串行执行的),当须要并行执行时,就会派生(fork)出多个线程,此时,主线程与这些派生线程协同工做,在并行代码段执行结束是,派生的线程挂起,控制流从新回到(join)主线程中,知道完成整个程序。(晚些时候会附个图说明)学习
从如今的应用看,这个组合占了半壁江山,因此仍是须要好好看看的,先上个示例代码:线程
#单层for循环更改 int b[300] #pragma omp parallel for for(int i = 0; i < 300; i++) b[i] = i;
上述代码即完成了此for
循环的并行化,比较简单,也比较经常使用,但有时候也会出现用到双重循环,这就须要进化下代码了:设计
#双重循环 #pragma omp parallel for private(j) for(int i = 0; i < 100; i++) for(int j = 0; j < n; j++) a[i][j] = j;
双重循环就有点难度了,须要讲解下, parallel for
不用解释了, private
声明私有变量,保证 j
的独立性,使其余线程没法访问此该变量。code
parallel for
及其附属占了半壁江山,那剩下的半壁江山就是即将介绍的:parallel sections
,该方法是为了实现功能并行,简单讲就是你能够分配线程a实现功能A,线程b实现功能B......待所有完成后,再统一回到主线程中:索引
#代码块功能并行 #pragma omp parallel sections { #pragma omp section { a = A; } #pragma omp section { b = B; } }
其中,#pragma omp section
中执行具备独立功能的代码块,方便灵活使用。接口