并行计算之OpenMP简介

OpenMP环境安装 基于ubuntu20.04

sudo apt-get update
sudo apt-get install libomp-dev

OpenMP概述

  1. 面向多线程并行编码的编译指导语句,如
 #pragma omp parallel
 #pragma omp for
 #pragma omp sections
  1. 包含相应的函数接口库和runtime(运行时系统)
omp_get_thread_num() //获取当前线程的线程编号
omp_get_num_threads() //获取正在执行的并行部分的线程数,也就是要执行代码块的线程数
omp_set_num_threads() //设置将要用于将来并行执行的线程数
  1. 极大的简化多线程编码,支持Fortran,C和C++,从SMP实现开始,已经发布和发展了25年

OpenMP执行模式

OpenMP采用fork-join的执行模式。

程序开始的时候只存在一个Master Thread,当需要进行并行计算的时候,添加相应的编译指导语句,开启多线程,此时会派生出若干个分支线程来执行并行任务。当并行代码执行完成,添加相应的编译指导语句,子线程会合,并把控制流程交给单独的主线程。

并行计算之OpenMP简介_第1张图片
整个过程,通过在需要并行执行的代码段添加OpenMP规范的编译指导语句来实现从主线程派生和销毁多个线程,并通过runtime系统或者OpenMP函数库的标准接口来控制线程的数量,调度,同步,互斥等。

OpenMP “Hello World”

代码实例

#include "omp.h"
#include 

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

上述结果不确定,因为是多线程,这里为了好看截取了比较整齐的一次结果。

你可能感兴趣的:(并行计算,并行计算,OpenMP,多线程)