一 什么是OpenMP?
在并行化计算中,远程内存访问的方式主要有三种shared memory, one-sided communication和Mesaage Passing。OpenMP就是基于shared memory的高度抽象的并行化计算API,具有良好移植性和扩展性。它是一种显性的(explict)的编程模式,给予了用户对完全控制并行化的能力。
二 OpenMP执行模式
OpenMP会顺序执行程序知道遇到了并行指令(parallel directive),当前线程会分出支干来并行化执行parallel directive的内容。所以,用户主要通过合理的插入编译指令(compiler directives)去控制各个资源的分分合合,决定什么时候并行concurency,什么时候同步(synchronization)。这种模式就是典型的Fork-join model
Fork:主线程创建多线程任务,eg,这里0就是主线程,一些特殊的指令仅仅会影响主线程。
Join:等待对应的Fork创建的主线程任务结束,同步后回到主线程上(或者说只保留主线程)
特别的,Fork-join model是可以嵌套的。并且嵌套的的fork join是独立于现有的线程的。
嵌套的例子:
三 编程模版
如何加载omp?
Compiler / Platform |
Compiler |
Flag |
Intel |
icc |
-openmp |
icpc |
||
ifort |
||
PGI |
pgcc |
-mp |
pgCC |
||
pgf77 |
||