OpenMP入门指南(一) —-并行计算导言和OpenMP基本概念.
作者:杨漱玉青.
声明:本文受Creative Commons 署名-非商业性使用-禁止演绎 2.5 中国大陆 License协议 保护.
前言:终于想有点写点指南的东西了,我也只是菜鸟,因此只能写点入门指南的东西。So,如果有什么错误和照顾不周的地方还请大家多多提出来.
Thanks!
什么是OpenMP?
您可以访问这里获 得OpenMP的介绍.
在我们的OpenMP开始之前,我们先来看一下x86多内核编程所带来新的问题。
一.并行编程带来的问题
1. 共享数据操作问题
假如有一个数据是需要被多个线程都要访问到,那么就会带来共享数据操控的问题,比如说变量i这个数据,thread 0想给i加1,而thread1却想给i减1,那么i被操作之后到底变成什么呢?
再来看,变量i初始值等于0,thread0判断如果i==0则继续下面的操作,而thread1则是去给i加1的,那么thread0和thread1 谁先去执行则变得后果也不同。
解决此问题一般采用两个方法:锁(LOCK)机制和原子 机制.
2. 任务的分解和调度问题
这是我们以后并行编程所要考虑的最大的地方
对于分解好的多个任务,如何将其均与的分配到各内核上面是非常重要的问题,这会直接影响加速比。
3. 加速比
为了标榜使用并行计算之后的带来的效率提升,一般使用加速比n来标明。
n=单核上最优算法计算时间/使用N个处理器并行计算时间.
关于并行计算的更多架构建议参考其他相关书籍,现在让我们进入OpenMP.
二.OpenMP基本概念
OpenMP的运行模式是Fork/Join执行模式,来看图:

程序中有一个主线程,程序中的串行部分都由主线程来执行,并行部分则由主线程生成的多个子线程执行,执行完毕之后再次回到主线程继续串行,也就是说,并行 部分没有结束,是不能执行串行的,这就是称之为Fork/Join并行模式.
OpenMP前期准备:Microsoft的Visual Studio和Intel C++编译器都支持OpenMP,使用之前还需要先打开OpenMP.
以Visual Studio 2008为例:新建好项目之后,在Solution Exploer上面的项目点击右键,选择Properties,在弹出的对话框中选择Configuration Properties下面的C/C++的Language,右侧在OpenMP Support选择Yes(/openmp)即可.

让我们来看一个简单的OpenMP例子,为我们以后的OpenMP学习做准备:
#include <stdio.h>
#include <omp.h>
#include <stdlib.h>
void main()
{
#pragma omp parallel num_threads(4)
{
printf(“Hello,World!ThreadId=%d.n”,omp_get_thread_num());
}
system(“pause”);
}
运行结果:

可以看到,尽管main里面只出现了一次prinf(“Hello,World!”),但是这里却显示了四次,这是因为我们通过创建了四个线程,每个线程 分别显示Hello,World!一次,具体代码是什么意思,让我们在下面的章节中解释。

gg 等待你下一章
@Bee GG, 谢谢哦,欢迎指正,HOHO.
你这个还能识别代码啊
@玉昌, 用代码高亮的插件.