CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  英特尔多核计算技术

多核优化小结(原创)--欢迎回复讨论

楼主dishening7()2006-08-18 15:24:47 在 专题开发/技术/项目 / 英特尔多核计算技术 提问

连学带做已经两周了,今天,针对多核的优化终于有效果了。下面把这两周来学习和做项目的经验作一总结:  
   
  1、对于多核多线程开发工具的选择上,经过调研,可选择的有OpenMP,win32线程库以及pThread库。对于OpenMP,由于是intel首推的多线程开发工具,并且看起来使用简单,所以开始打算用它作开发,但是学习过程中却发现它的一些不便之处:a、都是些预编译指令(#pragma)所以在单核机器上编译的程序在双核机器上运行时不能体现双核的优势;b、主要针对for循环进行优化(学习过程中发现主要是这样吧,虽然也可以针对一般情况),但项目中运算量比较大的for循环已经用mmx、sse、sse2优化过了;c、对编译器要求过高,一般要求vs2005或者需要intel编译器。由于以上原因,所以并没有选用该方式。而对于pThread库,虽然也比较成熟,并且便于移植,但由于只要求在win32平台优化,并且由于那本中文的参考书已经绝版了,跑了好些地方都买不到,所以便采用了win32线程库来开发。  
   
  2、参考资料:侯捷译的那本win32多线程程序设计。这本书虽然内容不够集中(个人认为废话比较多),也并非针对smp系统,但许多基本的概念讲的还是比较清楚的,又是中文的,所以建议买一本,毕竟师傅领进门,修行靠个人嘛,在者这本书的内容也比较老了,都是讲的winnt的东东,再不买等绝版了想买也买不到了:)  
   
  3、个人经验:a、线程、互斥量啊什么的毕竟也是一种系统资源,是要耗cpu的,并且我们的程序也不是只针对双核的,对单核而言引入这些东东一般来说就只有坏处没有好处了(说的有些太绝对了,由于这里的多线程化是针对多核的,所以多个线程执行的部分主要都是耗cpu型的“worker线程”而非一个线程是worker线程,另一个是I/O线程)所以,对于这些对象使用的基本原则应该是够用就行。我认为对于双核来说一个主线程两个work线程就足够了;b、对于互斥量啊临界区啊能不用尽量不用,应为他们不光是一种资源,同时在临界区或者互斥量保护的临界资源(说通俗点就是代码段)内,实际上是串行而非并行执行的。所以这种东东使用越多,代码的并行度就越低,所以最好好好研究下代码,尽量不要用这些对象。其实对于pc而言,现在内存比较大,完全可以通过空间换时间的方法避免使用互斥量等;c、一定要选择最耗CPU的代码段进行多线程化,并且每个线程中的计算量要足够大。先说第一点,因为多线程化一般对导致代码结构的改动,使代码的可读性变差,所以只有选择最耗CPU的部分进行多线程化,才值得这样做;对于第二点,主要是由于建立和删除线程都是有一定的开销的,如果每个线程中的计算量不大,却反复建立删除线程,则优化带来的好处还比不上建立删除线程的开销;d、写针对双核的程序一定要在写之前就规划好,那部分要多线程化。否则进行多线程化时代码的改动会很大,并且出了错也很难找出来。另外就是最好在非多线程代码的基础上进行多线程优化,可以把非多线程代码改写成多线程的模式,但不使用多线程,这种伪多线程代码比较容易调试。这样,先把这种伪多线程代码调试通过了,在改成对应的多线程程序,会比较容易些,出错的可能性也小些。  
   
  以上就是我这段时间多核优化的一些经验,双核应该是一种趋势,我也会继续学习,希望能和大家探讨。我的msn:yinpei_jj@hotmail.com  
  问题点数:20、回复次数:12Top

1 楼stonesky(流星雨)回复于 2006-08-20 02:44:32 得分 0

帮顶一下  
   
  我做有时效要求服务端设计比较多Top

2 楼zalyer(小照)回复于 2006-08-30 18:17:28 得分 0

写的很好,虽然我不太懂。哈哈。学习Top

3 楼BlueTrees(蜗牛)回复于 2006-08-31 00:09:04 得分 0

如果每个线程中的计算量不大,却反复建立删除线程  
   
  这个你可以参考线程池,windows封装了一组API实现线程池,你可以自己自己实现,比较考验你的能力。  
   
  同步对象,是必须的,主要用在访问共享数据上,如果是仅仅读写,那么原子操作就可以满足不需要特别的同步,但是,问题出在,程序的执行顺序上,如果程序需要依靠共享数据为条件来改变执行分支的,就必须在分支前保护,在完成所有可能分支后去掉保护。这是没办法的事情。Top

4 楼bluesen(善哉)回复于 2006-09-05 11:29:46 得分 0

我的产品在一开始就创建了上千个线程,每个线程相当于一个虚拟机,解释Koodoo脚本并运行,直到整个结束时才关闭全部线程。  
  http://www.bluespace.com.cn/koodoo/  
  各位有兴趣可以评论一下。Top

5 楼nasco(倪磊)回复于 2006-09-08 23:44:28 得分 0

你关于openMP的认识是错误的,openMP当然可以和MMX/SSE之类向量指令一起用。  
   
  比如你有一个AxA大小的矩阵,用SSE2的处理可以让你处理两个矩阵的加法的运算次数减少到(A*A)/4此  
   
  但是如果你有两个内核,用openMP,   MPI/PVM/BSP   (如果运算非加法,能使得粒度更大),完全继续并行相关的运算。  
  Top

6 楼pqmgumnq9n09za1kqbpp(我是菜鸟,为什么老是删我的帖子)回复于 2006-12-08 16:16:59 得分 0

我的板子是技嘉的   GA-6BXD,PCB   版本号   1.6,BIOS   更新到最新。跳线在   100MHz/5.0X,装上   2   只原装   OEM   PIII500   CPU,Solt1   接口,开机能够认到   2   个   CPU,显示  
   
  INTEL   440BX   CHIPSET  
  VCORE1=2.00V   VCORE2=2.00V  
  INTEL   PENTIUM   III-MMX   CPU   500MHz   ,   2   Processor(2)  
  <CPU2   ID=0636><PATCH   ID=0035><CPU1   ID=0636><PATCH   ID=0035>  
  Memory   Testing...   1048576KB   OK.  
   
  但是无论安装   WinNT   4.0   Win2000   Pro/Server   WinXP   都不能识别   2   个   CPU,任务管理器只有   1   个,任务管理器的图表菜单中也没有每个CPU一个图表的选项。  
   
  请教这是怎么回事?  
  Top

7 楼fftorpedo(鱼雷)回复于 2006-12-12 13:13:57 得分 0

那个potential大家优化到几秒了?Top

8 楼housisong(HouSisong)回复于 2006-12-18 11:13:14 得分 0

0.18sTop

9 楼housisong(HouSisong)回复于 2006-12-18 11:14:02 得分 0

封地估计值:)Top

10 楼longaway()回复于 2006-12-18 21:49:36 得分 0

学习。  
   
  谢谢楼主分享。Top

11 楼xiongzm()回复于 2006-12-19 18:01:15 得分 0

学习学习多线程了。想请教一下:哪位解释一下多线程和并行计算有什么关系和区别?Top

12 楼m2213231()回复于 2006-12-19 18:53:53 得分 0

谢谢楼主Top

相关问题

关键词

得分解答快速导航

  • 帖主:dishening7

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo