第三章 什么是OpenMP
OpenMP是一个用于编写并行程序的应用编程接口.虽然它一开始专注于SMP计算机的多线程程序,但是经过多年的发展,它已经可以应对NUMA系统和GPU等外设.
构成OepnMP的核心编译指令,运行时库函数和字句:
OpenMP编译指令,函数或子句 | 概念 |
---|---|
#pragma omp parallel | 并行区域,线程组,结构化块和跨线程交错执行 |
int omp_get_thread_num() int omp_get_num_threads() void omp_set_num_threads() |
SPMD模式:创建并行区域,使用线程数和线程ID分割工作 |
double omp_get_wtime() | 代码的定时块,加速比和阿姆达尔定律 |
export OMP_NUM_THREADS=N | 内部控制变量和用环境变量设置默认线程数 |
#pragma omp barrier #pragma omp critical |
交错执行,竞争条件和同步所隐含的操作 |
#pragma omp for #pragma omp parallel for |
共享工作,并行循环和循环携带依赖 |
reduction(op:list) | 跨组内线程的值归约 |
schedule(static[.chunk]) schedule(dynamic)[.chunk] |
循环调度,循环开销和负载平衡 |
private(list) firstprivate(list) shared(list) |
OpenMP数据环境:默认规则和修改默认行为的子句 |
default(none) | 每个变量的存储属性的强制显式定义 |
nowait | 禁用共享工作构造的隐含栅栏,栅栏的高成本以及刷新内存 |
#pragma omp single | 由单线程完成的工作 |
#pragma omp task #pragma omp taskwait |
任务,任务完成和用于任务的数据环境 |
OpenMP的主要组件:
- 硬件层: 处理器,共享内存
- 系统层: OpenMP运行时系统,支持共享内存和线程处理的OS
- 程序层: 指令,编译器,OpenMP库,环境变量
- 用户层: 应用,终端客户