多线程来加速程序执行。
特色
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線程來執行)(注意:setenv为tsch中查询或设置环境变量的指令。setenv是CSH的命令,bash不能用的) % ./a.out Hello, world. Hello, world.
争议
作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。 OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。