在长期渴望在面向矩阵的数值编程中并行化高度规则的循环之后, OpenMP 架构审查委员会 (ARB) 于 1997 年推出了OpenMP 。在随后的版本中,热情的 OpenMP 团队为其添加了许多功能,包括任务并行化、对加速器的支持、用户定义的缩减等等。最新的OpenMP 5.0版本于 2018 年 11 月发布。
开放式多处理 (OpenMP)是一种并行化 C/C++/Fortran 代码部分的技术。通过向 C/C++/Fortran 语言添加并行化功能,OpenMP 也被视为对它们的扩展。一般而言,OpenMP 使用可移植、可扩展的模型,为程序员提供简单灵活的接口,用于为从普通台式计算机到高端超级计算机的平台开发并行应用程序。
线程与过程
操作系统创建一个进程来执行具有给定资源(内存、寄存器)的程序;通常,不同的进程不会与另一个进程共享它们的内存。线程是进程的子集,它共享其父进程的资源,但有自己的堆栈来跟踪函数调用。一个进程的多个线程可以访问同一个内存。
并行内存架构
在深入研究 OpenMP 之前,让我们重温一下基本的并行内存架构。
这些分为三类;
- 共享内存:
OpenMP 属于共享内存概念。在这种情况下,不同的 CPU(处理器)将可以访问相同的内存位置。由于所有 CPU 都连接到同一个内存,因此应该小心处理内存访问。 - 分布式内存:
在这里,每个 CPU(处理器)都有自己的内存位置可供访问和使用。为了使它们进行通信,所有独立的系统将使用网络连接在一起。 MPI 基于分布式架构。 - 混合:混合是共享和分布式架构的组合。展示 OpenMP 强大功能的一个简单场景是比较普通 C/C++ 程序和 OpenMP 程序的执行时间。
安装 OpenMP 的步骤
- STEP 1:检查编译器的GCC版本
gcc --version
GCC 从其 4.2.0 版开始提供对 OpenMP 的支持。所以如果系统有4.2.0以上版本的GCC编译器,那么必须配置OpenMP特性。
如果系统没有GCC编译器,我们可以使用下面的命令
sudo apt install gcc
更详细的安装支持,我们可以参考这里
- 步骤 2:配置 OpenMP
我们可以使用以下命令检查 OpenMP 功能是否配置到我们的编译器中echo |cpp -fopenmp -dM |grep -i open
如果编译器中没有 OpenMP,我们可以使用以下命令配置它
sudo apt install libomp-dev
- STEP 3:设置线程数
在 OpenMP 中,在运行代码之前,我们可以使用以下命令初始化要执行的线程数。在这里,我们将要执行的线程数设置为 8 个线程。export OMP_NUM_THREADS=8
在 OpenMP 中运行第一个代码
// OpenMP header
#include
#include
#include
int main(int argc, char* argv[])
{
int nthreads, tid;
// Begin of parallel region
#pragma omp parallel private(nthreads, tid)
{
// Getting thread number
tid = omp_get_thread_num();
printf("Welcome to GFG from thread = %d\n",
tid);
if (tid == 0) {
// Only master thread does this
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n",
nthreads);
}
}
}
输出:
该程序将打印一条消息,该消息将由各个线程执行。
Compile:
gcc -o gfg -fopenmp geeksforgeeks.c
Execute:
./gfg