OpenMP

维基百科,自由的百科全书
跳转至: 导航搜索

OpenMP(Open Multi-Processing)是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的程式語言包括C语言C++Fortran;而支持OpenMP的编译器包括Sun StudioIntel Compiler,以及開放源碼GCCOpen64編譯器。OpenMP提供了对并行算法的高层的抽象描述,程序员通过在原始碼中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

目录

特色 [编辑]

OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。

語法 [编辑]

#pragma omp <directive> [clause[[,] clause] ...]

例子 [编辑]

omp parallel 段內的程序代碼由多線程來執行:

 int main(int argc, char* argv[])
 {
  #pragma omp parallel  
   printf("Hello, world.\n");
 
   return 1;
 }

執行結果 [编辑]

% gcc omp.c (由單線程來執行)
% ./a.out
Hello, world.

% gcc -fopenmp omp.c (由多線程來執行)
% ./a.out
Hello, world.
Hello, world.
Hello, world.
Hello, world.

環境變量 [编辑]

OpenMP可以使用環境變量 OMP_NUM_THREADS以控制執行線程的數量。

例子 [编辑]

% gcc -fopenmp omp.c 
% setenv OMP_NUM_THREADS 2(由2線程來執行)
% ./a.out
Hello, world.
Hello, world.

爭議 [编辑]

作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。 OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。

外部連結 [编辑]