周伟明的专栏

<<软件测试实践>> 已上市

用户操作
[即时聊天] [发私信] [加为好友]
周伟明ID:drzhouweiming
195130次访问,排名375好友2人,关注者27
软件技术爱好及研究者
drzhouweiming的文章
原创 50 篇
翻译 0 篇
转载 0 篇
评论 334 篇
周伟明的公告
一书已上市, 欢迎大家提出意见!
最近评论
domemy:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
domemy:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
domemy:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
domemy:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
domemy:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
文章分类
    收藏
      相册
      最近文章
      1、多核新观念-象使用内存一样使用CPU?
      2、多核编程中的任务随机竞争模式的概率分析
      3、OpenMP创建线程中的锁及原子操作性能比较
      4、多核编程中的任务分组竞争模式
      5、称球问题的测试解法
      90%程序员写不出无BUG的二分查找程序?
      C/C++代码检视实例
      多核编程中的负载平衡难题
      多核编程中的锁竞争难题
      微软过桥问题与测试人员素养
      接口关系稳定原理探索
      接口设计定理
      模块分解原理与三权分立
      模块分解原理的探索
      测试驱动需求分析
      筑一座坝治好中国的沙漠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 OpenMP并行程序设计(一)收藏

      新一篇: OpenMP并行程序设计(二) | 旧一篇: 双核CPU上的快速排序效率

       
      OpenMP并行程序设计(一)
       
      OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。
       
      在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。
       
      先看一个简单的使用了OpenMP程序
      int main(int argc, char* argv[])
      {
      #pragma omp parallel for
           for (int i = 0; i < 10; i++ )
           {
               printf("i = %d\n", i);
           }
           return 0;
      }
      这个程序执行后打印出以下结果:
      i = 0
      i = 5
      i = 1
      i = 6
      i = 2
      i = 7
      i = 3
      i = 8
      i = 4
      i = 9
       
      可见for 循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别)
      这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。
       
      有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。
       
       将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。下面就写一个简单的测试程序来测试一下:
       
      void test()
      {
           int a = 0;
           clock_t t1 = clock();
           for (int i = 0; i < 100000000; i++)
           {
               a = i+1;
           }
           clock_t t2 = clock();
           printf("Time = %d\n", t2-t1);
      }
       
      int main(int argc, char* argv[])
      {
           clock_t t1 = clock();
      #pragma omp parallel for
           for ( int j = 0; j < 2; j++ ){
               test();
           }
           clock_t t2 = clock();
           printf("Total time = %d\n", t2-t1);
       
           test();
           return 0;
      }
       
      在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。
      在main()函数里,先在一个循环里调用test()函数,只循环2次,我们还是看一下在双核CPU上的运行结果吧:
      Time = 297
      Time = 297
      Total time = 297
      Time = 297
       
      可以看到在for循环里的两次test()函数调用都花费了297ms, 但是打印出的总时间却只花费了297ms,后面那个单独执行的test()函数花费的时间也是297ms,可见使用并行计算后效率提高了整整一倍。
       
       
      下一篇文章中将介绍OpenMP的具体指令和用法。
       
       

      发表于 @ 2006年08月28日 11:17:00|评论(loading...)|编辑

      新一篇: OpenMP并行程序设计(二) | 旧一篇: 双核CPU上的快速排序效率

      评论

      #egmkang 发表于2008-05-13 14:18:27  IP: 116.225.182.*
      lz你好,我看了你这篇文章.写的不错!现在正在看这方面的东西.
      现在有一个问题.
      就是:你的那个程序,在Debug下程序的输出是正确的,但是在release下,输出全部是错误的.
      已经引用了omp.h那个头文件.
      请问怎么解决?
      egmkang#163.com
      #egmkang 发表于2008-05-13 14:29:59  IP: 116.225.182.*
      还有就是,程序写完之后,怎么才能使程序在其他的机器上面运行....
      我测试那个小程序,说什么应用程序配置不正确...
      谢谢
      #drzhouweiming 发表于2008-05-14 11:51:06  IP: 58.37.101.*
      请参考OpenMP并行程序设计(二)一文中的评论内容,看能不能解决。
      #drzhouweiming 发表于2008-05-14 11:52:52  IP: 58.37.101.*
      OpenMP并行程序设计(二)文章地址:http://blog.csdn.net/drzhouweiming/archive/2006/09/04/1175848.aspx
      #egmkang 发表于2008-05-15 16:32:12  IP: 116.225.149.*
      你好.我写了一个很简单的程序,debug,release都可以成功运行.现在发布的时候出现了一点问题.
      设置运行时库为/MT,其他的均为设置.
      然后copy VC\redist\X86\Microsoft.VC80.OPENMP目录下面的所有文件到.exe所在目录.
      但是到了别人的机器上面还是不能运行.
      希望那个你能帮我解决.谢谢.
      用depends工具检测,好像说还有问题,让我看系统日志.
      还是不行,再发一遍,lol
      #drzhouweiming 发表于2008-05-21 15:08:06  IP: 58.33.97.*
      To egmkang:

      简单拷贝应该是不行的,最好安装一下整个Redist包看行不行
      #dimire 发表于2008-05-29 00:52:28  IP: 218.2.216.*
      LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
      {
      #pragma omp parallel for
      for (int i = 0; i < 10; i++ )
      {
      printf("i = %d\n", i);
      }
      return 0;
      }
      正常情况下,应该是乱序输出0到9
      可我编译运行后,能正常乱序输出0到9,但有时候会重复输出一样的数字,比如i = 0
      i = 0
      i = 5
      i = 6
      i = 7
      i = 1
      i = 8
      i = 2
      i = 3
      i = 9
      i = 4

      i = 0
      i = 1
      i = 2
      i = 3
      i = 3
      i = 5
      i = 4
      i = 6
      i = 7
      i = 8

      这个好像是有个线程在重复执行两次,不知道为什么?
      #dimire 发表于2008-05-29 00:53:42  IP: 218.2.216.*
      LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
      {
      #pragma omp parallel for
      for (int i = 0; i < 10; i++ )
      {
      printf("i = %d\n", i);
      }
      return 0;
      }
      正常情况下,应该是乱序输出0到9
      可我编译运行后,能正常乱序输出0到9,但有时候会重复输出一样的数字,比如i = 0
      i = 0
      i = 5
      i = 6
      i = 7
      i = 1
      i = 8
      i = 2
      i = 3
      i = 9
      i = 4

      i = 0
      i = 1
      i = 2
      i = 3
      i = 3
      i = 5
      i = 4
      i = 6
      i = 7
      i = 8

      这个好像是有个线程在重复执行两次,不知道为什么?
      #dimire 发表于2008-05-29 00:55:18  IP: 218.2.216.*
      学习了
      #dimire 发表于2008-05-29 00:57:05  IP: 218.2.216.*
      LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
      {
      #pragma omp parallel for
      for (int i = 0; i < 10; i++ )
      {
      printf("i = %d\n", i);
      }
      return 0;
      }
      正常情况下,应该是乱序输出0到9
      可我编译运行后,能正常乱序输出0到9,但有时候会重复输出一样的数字,比如
      i = 0
      i = 0
      i = 5
      i = 6
      i = 7
      i = 1
      i = 8
      i = 2
      i = 3
      i = 9
      i = 4

      i = 0
      i = 1
      i = 2
      i = 3
      i = 3
      i = 5
      i = 4
      i = 6
      i = 7
      i = 8

      这个好像是有个线程在重复执行两次,不知道为什么?
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 周伟明