在Windows下使用MingGW[GCC+OpenMP]和CodeBlocks开发多核应用基本环境配置

转自 http://blog.csdn.net/danny_xcz/article/details/3332251


   从06年开始,多核开发已经越来越多的成为所有应用设计必须考虑的问题。我使用MingGW+CodeBlocks来测试OpenMP多核计算框架。虽然VC8里面已经有了对OpenMP的支持,但是VC体积有点大,而且众所周知的MS编译器在兼容性上的问题,所以决定采用标准的GCC来做开发。

  OpenMP只是并行开发的一种库,支持多核开发本质是将原本单线程的程序或算法变成多线程执行。OpenMP采用了类似Java的Annotation的方法来支持自动将任务转换成多线程,例如如果你的机器是双核的,自动将一个10000次的for循环自动分成两个5000次的循环,如果你的机器是四核的,则自动分成4个2500次的循环。

1 安装MingGW

   GCC目前最稳定的版本是3.4.5,此外4.3.0里面默认对OpenMP进行支持。因此最好在机器上同时装两个版本。
   Windows下使用GCC可以使用MingGW和Cygwin,我个人认为Cygwin过于庞大了,所以选用MingGW。
   在https://sourceforge.net/project/showfiles.php?group_id=2435中下载MingGW
   对于GCC3一般下载以下几个包:下载到C:/MinGW3目录中,然后直接解压到当前目录下。
   mingw-runtime-3.9.tar.gz
   gcc-core-3.4.5-20060117-3.tar.gz
   gcc-g++-3.4.5-20060117-3.tar.gz
   gdb-6.8-mingw-3.tar.bz2
   w32api-3.12-mingw32-dev.tar.gz
   binutils-2.19-mingw32-rc1-bin.tar.gz
   gdb-6.8-mingw-3.tar.bz2


   但是由于要开发OpenMP,所以还要再使用GCC4,一般包括以下几个包,从加粗的部分可以看到,最大的区别是gcc核心库的版本。下载到C:/MinGW4目录中,然后直接解压到当前目录下。
   mingw-runtime-3.9.tar.gz
   gcc-4.3.0-20080502-mingw32-alpha-bin.tar.gz
   gdb-6.8-mingw-3.tar.bz2
   w32api-3.12-mingw32-dev.tar.gz
   binutils-2.19-mingw32-rc1-bin.tar.gz
   gdb-6.8-mingw-3.tar.bz2


   MingGW安装好之后,将C:/MingGW/bin 加入到PATH变量里面就可以在命令行下面是用GCC了。


2 CodeBlocks
  这是MingGW官方Wiki里面推荐的开源IDE,我试用了一下,基本编译调试都没有什么问题。
  请到以下地址下载http://www.codeblocks.org/downloads/5
  安装好之后,在菜单Settings -> Compiler and debugging settings里面的Toolchain executables里面,可以切换不同的GCC版本。


3 使用OpenMP
  如果想让编译器能够编译OpenMP,首先在上面的配置中,使用C:/MinGW4.
  然后再Compiler settings里面的Other Options里面填入-fopenmp
  在Linker settings里面的Other linker Options里面填入-lgomp -lpthread
  如果在命令行下编译,可以使用命令
  g++ -fopenmp main.cpp -lgomp -lpthread -o main.exe


  注意如果发生一些找不到引用的错误,多办的可能就是没有加上-lgomp -lpthread


  好,到此位置,我们就可以开发OpenMP应用了,下面给出几个例子,都是网上的,不过我稍微改了一下:

	#include <stdio.h>
	#include <omp.h>
	#include <time.h>
	using namespace std;
	void eg_print()
	{
		#pragma omp parallel
		printf ("[%d] Hello/n", omp_get_thread_num());
	}

	void eg_for()
	{
		#pragma omp parallel for
		for(int i = 0; i <10; i++)
		{
			printf("i = %d/n", i);
		}
	}

	void eg_long_for()
	{
		int c = 0;
		clock_t t1 = clock();
		for(int i = 0; i <1000000000; i++)
		{
			c++;
		}
		clock_t t2 = clock();
		printf("Count = %d, t2 = %d, t1 = %d, Time = %d/n", c, t2, t1, t2-t1);
	}

	int main()
	{
		//eg_print();
		//eg_for();
		//测试
		clock_t t1 = clock();
		#pragma omp parallel for
		for( int j = 0; j <2; j++ )
		{
			eg_long_for();
		}
		clock_t t2 = clock();
		printf("Total time = %d/n", t2-t1);
		eg_long_for();
		return 0;
	}





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值