基于C++的OpenMP编程入门
随着集相关技术的发展,并行计算得到了越来越多的应用。本文即以简单的例子着手,介绍了在C++环境下并行计算的编程规范OpenMP的使用入门。
一、并行计算和OpenMP简介
并行计算指的是使用并行计算机来解决计算问题。上世纪70年代晚期,超大规模集成电路(VLSI)的出现使并行计算机得到了极大地推广,由此也推动了并行计算的发展。目前,解决并行编程的方法有以下四种 :
- 扩展现有的编译器,将串行程序转变为并行程序;
- 扩展串行编程语言,以允许用户创建和结束并行进程;
- 在串行语言上增加一个并行语言层,并行语言层控制着进程的创建和数据的分配;
- 创造一种新的并行语言。
其中使用最为广泛的是第二种方法。
针对使用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编程入门
发布评论