伪IT男
分类:
2007-07-26 10:11:27
最近由于工作的需要,一直在研究并行程序设计,试图采用多线程来解决工作中的问题。WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加上this指针。如果一定要以类成员函数作为线程函数,通常有如下解决方案:
(1)将该成员函数声明为static类型,去掉this指针;将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。
(2) ((2)不定义类成员函数为线程函数,而将线程函数定义为类的友元函数。这样,线程函数也可以有类成员函数同等的权限;
(3) 可以(3)对非静态成员函数实现回调,并访问非静态成员。
虽然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
由于VC6.0和VC2003没有/openmp开关来使能编译器支持OpenMP指令,但是我们可以通过改用Intel编译器的方法,来使它支持OpenMP指令。我们必须保证先安装VC6.0和VC2003,在安装Intel编译器,Intel编译器在其官方网站上下载。
VC6+Intel Compiler 9.1
1.安装完Intel编译器后,在VC6.0的Tools下面会新增一个关于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进行编译的说明,我想应该不难解决编译问题。
VC2003+Intel 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编译器后,可能会出现一些移植错误。
chinaunix网友2010-04-28 11:38:04
楼上的你好,我也碰到过像你的问题。你要先建一个项目过程为:文件- 新建--项目(自已需要的 ) 你可能用控制台程序( win32 console application)--下一步--选空项目--完成。这样在“解决方案管理器”中就有你创建的项目了,单击项目的名字使其变蓝,然后再单击“解决方案管理器”中的一个图标(当鼠标放在这个图标上面是会出现“属性”)这样就有你上面说的的过程了。然后你就可以自己去添加C程序了
chinaunix网友2008-05-17 10:46:36
你好,我使用的是VC2005的英文版,“点击配置属性页,然后[C/C++],然后[语言],选中OpenMP支持”这一操作我始终找不到。。你能帮我解决一下这个问题吗