红联Linux门户
Linux帮助

(原创)OpenMP并行编程简易教程(一)

发布时间:2008-04-19 23:00:02来源:红联作者:tedazf
近来在学校做实习,需要使用OpenMP来优化一些SAT问题的算法,便接触到了OpenMP,它是基于多处理器的,分享同一内存的,并行的编程模式。对于多核的CPU计算机,仅需要通过增加简单的语句,便可以得到立竿见影的性能提升。
本文教程由自己的学习笔记而来,通过4个例子简单的阐述OpenMP的基本编程语句。

例子1 helloworld.c
01 #include
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标准的语句,它的含义是让它后面的语句按照多线程来执行。需要注意的是每个线程都去做相同的事情。

[root@localhost zf]# gcc -fopenmp helloworld.c
[root@localhost zf]# ./a.out
Hello world!
编译,执行程序。屏幕上打印出了一遍”Hello world”。
-fopenmp 是gcc编译支持OpenMP程序的参数,gcc4.2以上的版本默认支持OpenMP。
由于系统环境变量中的NUM_OMP_THREADS的值默认为1,所以程序在执行的时候只使用了一个线程来执行。

[root@localhost zf]# NUM_OMP_THREADS=5
[root@localhost zf]# export NUM_OMP_THREADS
[root@localhost zf]# ./a.out
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
给表示线程数量的环境变量NUM_OMP_THREADS赋值为5并导出,再执行程序,得到5遍的”Hello world!”,说明程序将打印语句用5个线程分别执行了一遍。
当然,我们不希望受到运行系统环境变量的限制,所以我们也可以通过替换06行代码为” #pragma omp parallel num_threads(10)”,编译之后再执行程序,我们得到10遍的”Hello world!”,这时无论环境变量NUM_OMP_THREADS的值为多少,我们依然只能得到10遍的”Hello world!”。

例子2 RankNum.c
01 #include
02 #include
03 int main( int argc, char **argv)
04 {
05 int rank, size;
06 #pragma omp parallel private(rank)
07 {
08 rank= omp_get_thread_num();
09 size= omp_get_num_threads();
10 printf( "Hello world! I'm %d of %d\n", rank, size );
11 }
12 return 0;
13 }
导入omp.h文件以支持OpenMP的函数。
函数omp_get_threads_num() 返回当前的线程标号。函数omp_get_num_threads() 返回当前的线程数量。(不再程序中定义线程数,使用环境变量中的数据,当前是10)

[root@localhost zf]# gcc -fopenmp RankNum.c
[root@localhost zf]# ./a.out
Hello world! I’m 8 of 10
Hello world! I’m 0 of 10
Hello world! I’m 4 of 10
Hello world! I’m 6 of 10
Hello world! I’m 3 of 10
Hello world! I’m 2 of 10
Hello world! I’m 7 of 10
Hello world! I’m 1 of 10
Hello world! I’m 9 of 10
Hello world! I’m 5 of 10
编译,执行,得到10条输出,10个线程分别执行了打印语句。
线程执行的顺序随机,与编号无关。

未完待续……


注:本文源于Robert Roy博士的教学教案(法语),如有人感兴趣可以发邮件向我索要教案原文。
文章评论

共有 5 条评论

  1. lishidekuqi 于 2011-11-10 14:55:34发表:

    牛人一个,啥也不说了.

  2. liug86 于 2009-02-23 12:16:50发表:

    {:2_97:}学习了,不过还是没怎么清楚

  3. wangfengmadking 于 2008-05-18 13:52:03发表:

    上面是多个线程运行同一个任务,那么怎样实现多个线程完成不同任务

  4. wangfengmadking 于 2008-05-18 13:46:26发表:

    好,楼主果然是及时雨,我正在考虑学习

  5. altaitai 于 2008-04-19 23:24:59发表:

    学习了