• 关于linux下的openmp编程基础[转]


    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" 如果用intel的icc 编译器,就要写上这行
    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程序的编译和连接,编译器会自动地将用户的代码和OpenMP在Windows下实现的库vcomp.dll连接在一起。程序在运行的时候会自动地寻找vcomp.dll。下面用Visual Studio.Net 2005生成一个新OpenMP项目OpenMP1。
    类别:多核 查看评论
  • 相关阅读:
    POJ1741 Tree(树分治)
    codeforces713D Animals and Puzzle(二维倍增)
    codeforces713C Sonya and Problem Wihtout a Legend(dp)
    codeforces724E Goods transportation(最小割——dp)
    codeforces710E Generate a String(dp)
    codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) 题解(A-D)
    BNUOJ52317 As Easy As Possible(树上倍增)
    hihocoder1386 Pick Your Players(dp)
    常用函数
    vector总结(更新中。。。)
  • 原文地址:https://www.cnblogs.com/dorothychai/p/2268126.html
Copyright © 2020-2023  润新知