基于C++的OpenMP编程入门

随着集相关技术的发展,并行计算得到了越来越多的应用。本文即以简单的例子着手,介绍了在C++环境下并行计算的编程规范OpenMP的使用入门。

一、并行计算和OpenMP简介

并行计算指的是使用并行计算机来解决计算问题。上世纪70年代晚期,超大规模集成电路(VLSI)的出现使并行计算机得到了极大地推广,由此也推动了并行计算的发展。目前,解决并行编程的方法有以下四种 :

  1. 扩展现有的编译器,将串行程序转变为并行程序;
  2. 扩展串行编程语言,以允许用户创建和结束并行进程;
  3. 在串行语言上增加一个并行语言层,并行语言层控制着进程的创建和数据的分配;
  4. 创造一种新的并行语言

其中使用最为广泛的是第二种方法。

针对使用C语言完成并行程序设计,产生了一系列的规范,其中最流行的是MPI标准和OpenMP标准。它们的区别在于,MPI多用于多计算机联网协作,在单台计算机上进行多核并行计算效率低,OpenMP针对共享存储环境开发,适合于多核CPU上的并行程序设计。

二、针对for循环的并行化

C 和 C++ 语言编译器的指导语句记作 pragma ,它是 ”pragmatic information” 的简称,起着和编译器交互信息的作用。编译指导语句起着优化程序的作用,但这不是必须的,因此,在忽略编译指导语句的情况下,编译器仍能生成正确的目标程序。

在 C 和 C++ 语言中,一个并行程序设计的典型例子就是针对 for 循环的并行化,它的最简单的编译指导语句如下:

#pragama omp parallel for {   }  大括号中的代码会被每个执行绪执行;

这里要求 for 循环不能包含允许循环提前退出的语句,例如:break、return、exit、goto等,此外,由于是共享内存,数据要求不存在依赖关系。

三、第一个OpenMP并行程序

在C和C++语言中,如果要使用parallel制导指令,就需要包含头文件 <omp.h> ,特别注意,它是大小写敏感的。

VS编译器从VS 8.0(VS 2005)之后开始支持OpenMP,在这里以VS2015为例:
参考相关教程完成环境设置后,可以开始并行程序设计。

以下为使用OpenMP的一个简单例子:

#include <iostream>
#include <stdio.h>
#include "omp.h"
using namespace std;
int main() 
{
	omp_set_num_threads(4);    //设置执行绪的数量
#pragma omp parallel for
  {
	for (int i = 0; i < 10; i++)
    {
		printf("i = %d, Hello World!", i);
    }
  }
}

输出结果为:

i = 0, Hello World!
i = 2, Hello World!
i = 1, Hello World!
i = 3, Hello World!
i = 4, Hello World!
i = 6, Hello World!
i = 5, Hello World!
i = 7, Hello World!
i = 9, Hello World!
i = 8, Hello World!

更多OpenMP标准可以参考www.openmp。

更多推荐

基于C++的OpenMP编程入门