Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403470
  • 博文数量: 77
  • 博客积分: 3149
  • 博客等级: 中校
  • 技术积分: 828
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 11:48
文章存档

2012年(5)

2011年(2)

2010年(11)

2009年(44)

2008年(15)

我的朋友

分类: LINUX

2009-06-10 10:56:26

 

       OpenMP是专门针对共享地址空间的平行计算机提供的并行计算库,在Intel C++Visual C++ 8.0里通过#pragma支持。用OpenMP,可以不必去写诸如CreateThread之类的线程管理代码,多线程程序写起来比较简洁。而且OpenMP提供了很丰富的指令,对于同步共享变量、合理分配负载等任务,都提供了有效的支持,很值得一学。不过因为这个东西用起来很轻松,稍一疏忽就能酿成愚蠢错误,所以肯定是要经常用才能驾驭好的。一开始用它,犯错误是难免的。下载安装gcc4.2后,编译的时候加上-fopenmp参数即可。

       gcc  -fopenmp  test_omp.c
       g++  -fopenmp  test_omp.cc
       gfortran  -fopenmp  test_omp.f90(95)

       尽管很多文献都说gcc4.2以上版本才支持openmp,笔者所用的gcc编译器版本为4.1.1,实验表明也支持openmp,安装fedora 7以上版本,gcc默认就支持openmp.

[xuyc@sv168 openmp]$ gcc -v

使用内建 specs

目标: i386-redhat-linux

配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux

线程模型:posix

gcc 版本4.1.1 20070105 (Red Hat 4.1.1-52)

 

例子1  helloworld.c
01 #include

//#include "omp.h" 如果用intelicc 编译器,就要写上这行
02 int main( argc, argv)
03 int argc;
04 char **argv;
05 {
06 #pragma omp parallel
07 printf( "Hello world!\n" );
08 return 0;
09 }
   
程序helloworld.c的本质就是在屏幕上打印字符串”Hello world!”
    “#pragma omp parallel”
是一条OpenMP标准的语句,它的含义是让它后面的语句按照多线程来执行。需要注意的是每个线程都去做相同的事情。

[xuyc@sv168 openmp]$ gcc –fopenmp –o  helloworld  helloworld.c

[xuyc@sv168 openmp]$ OMP_NUM_THREADS=10

[xuyc@sv168 openmp]$ export OMP_NUM_THREADS

[xuyc@sv168 openmp]$ ./helloworld 

Hello world!

Hello world!

Hello world!

Hello world!

OMP_NUM_THREADS=2 ./helloc

如果不定义OMP_NUM_THREADS,默认会等于CPU数量,在8核心的机器上,会打印出8"Hello World".

 

[xuyc@sv168 openmp]$cat /proc/cpuinfo  查看CPU核的数量,可以看到有四个核

[xuyc@sv168 openmp]$ cat /proc/cpuinfo

processor       : 0

vendor_id       : GenuineIntel

cpu family      : 6

model           : 15

model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz

stepping        : 11

cpu MHz         : 2400.138

cache size      : 4096 KB

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 10

wp              : yes

flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush d                                         ts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx                                          est tm2 cx16 xtpr lahf_lm

bogomips        : 6002.73

 

processor       : 1

vendor_id       : GenuineIntel

cpu family      : 6

model           : 15

model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz

stepping        : 11

cpu MHz         : 2400.138

cache size      : 4096 KB

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 10

wp              : yes

flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush d                                         ts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni monitor ds_cpl                                          vmx est tm2 cx16 xtpr lahf_lm

bogomips        : 6002.73

 

processor       : 3

vendor_id       : GenuineIntel

cpu family      : 6

model           : 15

model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz

stepping        : 11

cpu MHz         : 2400.138

cache size      : 4096 KB

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 10

wp              : yes

flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush d                                         ts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni monitor ds_cpl                                          vmx est tm2 cx16 xtpr lahf_lm

bogomips        : 6002.73

 

  示例xx.c

  1  #include

  2  #include

  3  int main( int argc, char **argv)

  4  {

  5  int rank, size;

  6  #pragma omp parallel private(rank)

  7  {

  8  rank= omp_get_thread_num();

  9  size= omp_get_num_threads();

 10  printf( "Hello world! I'm %d of %d\n", rank, size );

 11  }

 12  return 0;

 13  }

[xuyc@sv168 openmp]$ gcc -fopenmp -o xx xx.c

[xuyc@sv168 openmp]$ ./xx

Hello world! I'm 0 of 4

Hello world! I'm 1 of 4

Hello world! I'm 2 of 4

Hello world! I'm 3 of 4

 

Microsoft Visual Studio .net 2005完全支持OpenMP编程[5]Visual Studio. Net 2005 Professional安装之后,即可编写OpenMP程序,无须另外安装其它软件。当前的Visual Studio. Net 2005完全支持OpenMP 2.0标准。通过新的编译器选项/openmp来支持OpenMP程序的编译和连接,编译器会自动地将用户的代码和OpenMPWindows下实现的库vcomp.dll连接在一起。程序在运行的时候会自动地寻找vcomp.dll。下面用Visual Studio.Net 2005生成一个新OpenMP项目OpenMP1

 

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