openmp,openMP 多线程编程【转】

前言
总算学完了OpenMP多线程编程的内容,由于在《读者》上看到20岁以后,大脑就开始衰老,所以为了保持住不太牢靠的记忆,我决定重新拾起十年前的习惯:归纳总结~
OpenMP简介
OpenMP诞生于1997年,由此看来,已经是十多年的历史了。目前已经有3.0的版本了,但是我使用的是VS2005自带的2.0版本,所以有些功能还不是很健全,譬如task。注意其支持的语言主要是Fortran和C语言,所以各位朋友在选择的时候要谨慎处理。在这里,我想展开想象的翅膀,跑题到Java语言的多线程编程中看看。
据我目前的知识了解到,Java多线程编程主要是通过继承Thread类或实现Runnable接口来实现的。创建线程是通过new关键字,具体的操作在run()里完成。整体思想可以理解为:
1.完成一个能实现具体功能的线程类,其中的“具体功能”体现在内部的run()方法中;
2.如果想使用某个线程来完成上述类的具体功能,则需要在相应的位置生成该类的对象从而实现调用。这个过程是比较标准的OO编程思想。
回到我们的主题里,OpenMP可以理解为在C或Fotran语言里,利用自身的编译指导、库函数以及环境变量,对其功能进行拓展,简单易学。给个例子,大家自己体会一下,就很清晰了。
1 #include "stdafx.h";
2 #include <omp.h> //OpenMP头文件
3 int _tmain(int argc, _TCHAR* argv[])
4 {
5 printf(&quot;This is a OpenMPtest!\n&quot;); //串行执行
6 printf(&quot;Start...\n&quot;);
7 #pragma omp parallel //生成多个线程,执行并行语句
8 {
9 printf(&quot;Hello world! Thread number is %d\n&quot;,omp_get_thread_num());
10 } //并行执行结束
11 printf(&quot;The end!\n&quot;);
12 return 0;
13 }
其中比较陌生的地方自然就是OpenMP的内容了:其中第7行是编译指导;第9行是库函数调用,为此我们引入了omp.h;其中具体有几个线程被生成,没有提到,这个是通过环境变量设置或默认的。
编译环境选择及搭建
结合当前比较火热的编译器,我们选择VS2005,大材小用一次。我们只利用其中C++的控制台程序。但是由于其强大的库函数已包括OpenMP,所以无须自己添加环境,只需要修改配置即可。
在编译之前通过菜单项目—>OpenMPtest属性,选择配置属性|C/C++|语言,将OpenMP支持一项,修改为:是(/openmp)
基本编译指导语句
在OpenMP中,创建线程的编译指导语句格式如下:
#pragma omp parallel [clause[clause]…]
{
//并行区域代码
}
只有有了这句话,才能体现出“多线程”。而且,可以看出,该语法不是C或Fotran的语法,所以是独立的语句,如果对于不支持OpenMP的编译器,该语句也不会报错,会被当作注释忽略掉而维持单线程的执行模式,其优势不言而喻。
由于是创建了多个线程执行相同的事情,可以理解是多个线程做重复的工作,而很多情况下,我们需要的是任务分配,每个线程做不同的工作。于是,有下面的语句可以完成。
#pragma omp parallel for [clause[clause]…]
for( index=first; test_ loop_variable;change_loop_variable)
{
//循环体语句
}
注意,只是多了个for,之后的内容就是分解完成。对于第一个语句,可以理解为,同学们做作业,每人都需要完成;后者可以理解大家合作做项目,每个人只需要完成一个模块,最后集体完成一个项目即可。
以上内容就已经帮我们创建多线程,以及任务分配了。我们需要在具体的需求下做具体的选择。先说到这儿,下次说说数据冲突,就是由于这些并行(多线程)而带来的后患,我们应该怎么处理~~~
Tags:  openmp

延伸阅读

最新评论

发表评论