Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2120517
  • 博文数量: 454
  • 博客积分: 10921
  • 博客等级: 上将
  • 技术积分: 5396
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-15 15:20
个人简介

伪IT男

文章分类

全部博文(454)

文章存档

2016年(2)

2013年(6)

2012年(17)

2011年(29)

2010年(24)

2009年(54)

2008年(53)

2007年(202)

2006年(67)

分类:

2007-07-26 10:11:27

 

VC上使用OpenMP并行程序设计

 最近由于工作的需要,一直在研究并行程序设计,试图采用多线程来解决工作中的问题。WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加上this指针。如果一定要以类成员函数作为线程函数,通常有如下解决方案:

(1)将该成员函数声明为static类型,去掉this指针;将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。

(2) ((2)不定义类成员函数为线程函数,而将线程函数定义为类的友元函数。这样,线程函数也可以有类成员函数同等的权限;

(3) 可以(3)对非静态成员函数实现回调,并访问非静态成员。

 

       线程之间通信的两个基本问题是互斥和同步。线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。

    虽然WIN32提供的一组API函数在大多时候是可以解决多线程问题,但是由于工作程序中涉及的变量太多,函数之间的调用关系比较复杂,发现用WIN32提供的一组API函数实现起来难度很大,后来就改用OpenMP

  OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型,包含编译制导(Compiler Directive)、运行库例程(Runtime Library)和环境变量(Environment Variables),支持增量并行化(Incremental Parallelization)。是C/C++ Fortan等的应用编程接口。

  要使用OpenMP,首先开发环境必须支持OpenMP,在这个过程,遇到了很多的问题,在此我把它整理出来与大家共享,希望对初学OpenMP的人有些帮助。

VC2005

VC版本中,只有Visual C++ 2005提供了一个新的/openmp开关来使能编译器支持OpenMP指令。(你也可以通过项目属性页来使能OpenMP指令。点击配置属性页,然后[C/C++],然后[语言],选中OpenMP支持。)当/openmp参数被设定,编译器将定义一个标识符_OPENMP,使得可以用#ifndef _OPENMP来检测OpenMP是否可用.(配置图见相册 VC上使用OpenMP并行程序设计:VC2005设置)

1. 虽然 VisualStudio 2005 Express 也有 OpenMP 的选项,但是实际上并没有附上 OpenMP 的函数库,所以理论上是不能用的;不过如果能找到 Standard Professional 版的版本放进去,也是可以运作的!

2. 神奇的是…原则上如果沒有用到 OpenMP Function,而只是用 directive clause 的话,应该是可以不用 #include 才对;但是在 Express 中,不加入 #include 可以正确的编译、执行,而 Professional 版却只能正确的编译,而无法正确的执行(dll 起始错误)。

    由于VC6.0VC2003没有/openmp开关来使能编译器支持OpenMP指令,但是我们可以通过改用Intel编译器的方法,来使它支持OpenMP指令。我们必须保证先安装VC6.0VC2003,在安装Intel编译器,Intel编译器在其官方网站上下载。

VC6Intel Compiler 9.1

1.安装完Intel编译器后,在VC6.0Tools下面会新增一个关于Intel编译器,进入勾选安装的Intel编译器版本(推荐使用Intel Compiler 9.1版本)。

2.在project中打开project  settings,在C/C++ ->Preprocessor definitions里加入_USE_INTEL_COMPILER 即可以使用Intel Compiler 进行编译。编译窗口应该显示使用icl进行编译,OpenMP支持可以在C/C++ -> Project Options 里添加 /Qopenmp。(配置图见相册VC上使用OpenMP并行程序设计中:VC6.0设置)

建议仔细阅读Intel Compiler的帮助,里面有详细的如何在VC6上使用Intel Compiler进行编译的说明,我想应该不难解决编译问题。

  VC2003Intel Compiler 9.1

1.  1.装换使用Intel编译器,点击Convert to use Intel(R) C++ Project System. (配置图见相册VC上使用OpenMP并行程序设计中:VC2003设置)

2.打开项目->属性页,选择支持OpenMP. (配置图见相册VC上使用OpenMP并行程序设计中:VC2005设置)

  我相信只要按照上面的步骤执行,应该是可以在VC环境下支持使用OpenMP。另外还要注意的一点就是,由于Intel 编译器比VC++自带的编译器要严格,所以在改用Intel编译器后,可能会出现一些移植错误。

阅读(8654) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-04-28 11:38:04

楼上的你好,我也碰到过像你的问题。你要先建一个项目过程为:文件- 新建--项目(自已需要的 ) 你可能用控制台程序( win32 console application)--下一步--选空项目--完成。这样在“解决方案管理器”中就有你创建的项目了,单击项目的名字使其变蓝,然后再单击“解决方案管理器”中的一个图标(当鼠标放在这个图标上面是会出现“属性”)这样就有你上面说的的过程了。然后你就可以自己去添加C程序了

chinaunix网友2008-05-17 10:46:36

你好,我使用的是VC2005的英文版,“点击配置属性页,然后[C/C++],然后[语言],选中OpenMP支持”这一操作我始终找不到。。你能帮我解决一下这个问题吗