OpenMP环境安装 基于ubuntu20.04
sudo apt-get update
sudo apt-get install libomp-dev
OpenMP概述
- 面向多线程并行编码的编译指导语句,如
#pragma omp parallel
#pragma omp for
#pragma omp sections
- 包含相应的函数接口库和runtime(运行时系统)
omp_get_thread_num() //获取当前线程的线程编号
omp_get_num_threads() //获取正在执行的并行部分的线程数,也就是要执行代码块的线程数
omp_set_num_threads() //设置将要用于将来并行执行的线程数
- 极大的简化多线程编码,支持Fortran,C和C++,从SMP实现开始,已经发布和发展了25年
OpenMP执行模式
OpenMP采用fork-join的执行模式。
程序开始的时候只存在一个Master Thread,当需要进行并行计算的时候,添加相应的编译指导语句,开启多线程,此时会派生出若干个分支线程来执行并行任务。当并行代码执行完成,添加相应的编译指导语句,子线程会合,并把控制流程交给单独的主线程。
整个过程,通过在需要并行执行的代码段添加OpenMP规范的编译指导语句来实现从主线程派生和销毁多个线程,并通过runtime系统或者OpenMP函数库的标准接口来控制线程的数量,调度,同步,互斥等。
OpenMP “Hello World”
代码实例
#include "omp.h"
#include <iostream>
int main()
{
#pragma omp parallel
{
int id = omp_get_thread_num();
std::cout << "Hello World id = " << id << std::endl;
}
return 0;
}
编译
g++ main.cpp -fopenmp
通过环境变量设置开启的线程数
export OMP_NUM_THREADS=4
运行
Hello World id = 0
Hello World id = 2
Hello World id = 1
Hello World id = 3
上述结果不确定,因为是多线程,这里为了好看截取了比较整齐的一次结果。