免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12641 | 回复: 16
打印 上一主题 下一主题

[技术动态] OPENMP的一个恶心问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-08 17:01 |只看该作者 |倒序浏览
我在LINUX下使用g++编译器,做一个OPENMP的优化处理实验,代码如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <strings.h>
  4. #include <time.h>
  5. #include <omp.h>

  6. int main()
  7. {
  8.   long long k = 20;
  9.   int i;
  10.   int j[10] = {101,102,103,104,105,106,107,108,109,110};
  11.   printf("begin k=%d\tj[0]=%d\n", k,j[0]);
  12.   time_t t, t1;
  13.   t = time(NULL);
  14. omp_set_num_threads(7);
  15. #pragma omp parallel for
  16. for(i = 0; i < 7; i++)
  17. {
  18.                 int rank = omp_get_thread_num();
  19.           int count = omp_get_num_threads();     
  20.           printf("Hello from thread %d of %d\n", rank, count);
  21.   for( k=0; k < 1000000000; k++)
  22.   {
  23.     j[k%10] = k*k;
  24.   }
  25. }
  26.         t1 = time(NULL);
  27.   printf("time = [%d]\n", t1 - t);
  28.   printf("end k=%d\tj[0]=%d\n", k,j[0]);
  29. }
复制代码
分别采用OPENMP编译与不采用OPENMP编译的方式结果如下:

采用OPENMP的情况
begin k=20        j[0]=101
Hello from thread 0 of 7
Hello from thread 3 of 7
Hello from thread 4 of 7
Hello from thread 5 of 7
Hello from thread 6 of 7
Hello from thread 1 of 7
Hello from thread 2 of 7
time = [72]
end k=1000000000        j[0]=-11782044

不采用OPENMP的情况
begin k=20        j[0]=101
Hello from thread 0 of 1
Hello from thread 0 of 1
Hello from thread 0 of 1
Hello from thread 0 of 1
Hello from thread 0 of 1
Hello from thread 0 of 1
Hello from thread 0 of 1
time = [27]
end k=1000000000        j[0]=-11782044

采用OPENMP的的情况反而效率变低了,我的LINUX环境是
Linux FC14-1 2.6.35.14-106.fc14.x86_64 #1 SMP Wed Nov 23 13:07:52 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux, 2CPU, 8核(所以才用7个线程)

请那位使用过openmp的高手指点一下,我才vs2008上实验一个类似的程序,效果也是使用openmp时效率大幅下降了,很奇怪。

论坛徽章:
0
2 [报告]
发表于 2012-10-08 17:20 |只看该作者
看来用OPENMP提高软件性能的人比较少呀,大家谁知道给点思路也成呀。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2012-10-08 17:22 |只看该作者
没用过openmp,不过我觉得问题出在j上,这个数组被多个线程修改,会导致缓存失效,应该把j这个数组打散。
具体搜索 false sharing。

论坛徽章:
0
4 [报告]
发表于 2012-10-08 17:30 |只看该作者
其实,j这个数组我就是想做一个公式,或者一个处理随便编的,楼上说的我去试试,看是否是多个线程同时访问同一缓冲区造成的,其实这个循环不是一开始就效率下降的,内部循环次数减少一些时效率是提高状态,很奇怪

论坛徽章:
0
5 [报告]
发表于 2012-10-08 17:34 |只看该作者
定义了一个变量zz,将原有公式转换成zz += k * k;结果发现效率还是不比串行的效率

论坛徽章:
0
6 [报告]
发表于 2012-10-08 17:47 |只看该作者
楼上说的很有道理,我将程序的循环修改为#pragma omp parallel for private(zz),即将zz变量私有化后,运算从14秒瞬间变为0,不过结果好像就不对了,不过可以肯定的是openmp内部线程管理对共享资源访问是有一定的特殊处理的

论坛徽章:
0
7 [报告]
发表于 2012-10-09 11:04 |只看该作者
我的问题已经解决了,在此做一个总结,以便遇到相同问题的兄弟参考,除了上述问题会影响运算效率外,在OPENMP环境下,每个调用的函数层数也会影响运算效率,即如果一个算法中调用多个嵌套函数的话,用OPENMP并行它,运算结果可能还不如串行效率高,个人猜测是分配同一函数的堆栈太多,就像递归调用一样对系统资源以及访问效率都会有一定影响。尽量让自己并行部分“干净”一点是提高效率的最好的方法。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
8 [报告]
发表于 2012-10-09 11:32 |只看该作者
我用OpenMP的效果也是性能下降。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
9 [报告]
发表于 2012-10-09 12:05 |只看该作者
fender0107401 发表于 2012-10-09 11:32
我用OpenMP的效果也是性能下降。



   这个需要调试,加锁操作要尽量少,这样基本可以有 N (CPU数) 倍的速度。

论坛徽章:
0
10 [报告]
发表于 2012-10-09 13:42 |只看该作者
其实这次的心得就是,使用OPENMP比较简单,但是需要对原有代码进行并行优化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP