在对面向矩阵的数值编程中高度规则的循环进行并行化的长期需求后,OpenMP由OpenMP体系结构审查委员会(ARB)于1997年推出。在随后的发行版中,热心的OpenMP团队为其添加了许多功能,包括任务并行化,对加速器的支持,用户定义的缩减等。最新的OpenMP 5.0版本于2018年11月发布。
开放式多处理(OpenMP)是一种并行化C / C++ / Fortran代码段的技术。通过将并行化功能添加到OpenMP中,OpenMP还被视为对C / C++ / Fortran语言的扩展。通常,OpenMP使用可移植的,可扩展的模型,该模型为程序员提供了一个简单灵活的界面,用于为从普通台式计算机到高端超级计算机的平台开发并行应用程序。
螺纹与工艺
操作系统创建一个进程以执行具有给定资源(内存,寄存器)的程序;通常,不同的进程不会与其他进程共享其内存。线程是进程的子集,它共享其父进程的资源,但具有自己的堆栈来跟踪函数调用。一个进程的多个线程将有权访问同一内存。
并行存储器架构
在深入研究OpenMP之前,让我们重温基本的并行内存体系结构。
这些分为三类:
- 共享内存:
OpenMP属于共享内存概念。这样,不同的CPU(处理器)将可以访问相同的内存位置。由于所有CPU都连接到同一内存,因此应谨慎处理内存访问。 - 分布式内存:
在这里,每个CPU(处理器)将拥有自己的内存位置以供访问和使用。为了使它们进行通信,将使用网络将所有独立的系统连接在一起。 MPI基于分布式体系结构。 - 混合:混合是共享和分布式体系结构的组合。展示OpenMP强大功能的简单方案是比较普通C / C++程序和OpenMP程序的执行时间。
安装OpenMP的步骤
- 步骤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
- 步骤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