免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12687 | 回复: 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
17 [报告]
发表于 2012-10-25 09:13 |只看该作者
恶心问题哪都有。只要静下心来慢慢研究都是可以解决的

论坛徽章:
0
16 [报告]
发表于 2012-10-19 11:16 |只看该作者
确实是这样子的

论坛徽章:
0
15 [报告]
发表于 2012-10-17 16:13 |只看该作者
没用过openmp,不过我觉得问题出在j上,这个数组被多个线程修改,会导致缓存失效,应该把j这个数组打散。
具体搜索 false sharing。

论坛徽章:
0
14 [报告]
发表于 2012-10-12 16:22 |只看该作者
个人觉得应该private(k)。

论坛徽章:
0
13 [报告]
发表于 2012-10-12 09:58 |只看该作者
也是支持,我代表大家顶你了

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

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
11 [报告]
发表于 2012-10-09 16:35 |只看该作者
本帖最后由 egmkang 于 2012-10-09 16:36 编辑

忽略,当我没说

论坛徽章:
0
10 [报告]
发表于 2012-10-09 13:42 |只看该作者
其实这次的心得就是,使用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数) 倍的速度。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP