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

dishening7 2006-08-18 03: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
...全文
1428 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
m2213231 2006-12-19
  • 打赏
  • 举报
回复
谢谢楼主
xiongzm 2006-12-19
  • 打赏
  • 举报
回复
学习学习多线程了。想请教一下:哪位解释一下多线程和并行计算有什么关系和区别?
housisong 2006-12-18
  • 打赏
  • 举报
回复
封地估计值:)
housisong 2006-12-18
  • 打赏
  • 举报
回复
0.18s
longaway 2006-12-18
  • 打赏
  • 举报
回复
学习。

谢谢楼主分享。
fftorpedo 2006-12-12
  • 打赏
  • 举报
回复
那个potential大家优化到几秒了?
  • 打赏
  • 举报
回复
我的板子是技嘉的 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一个图表的选项。

请教这是怎么回事?
nasco 2006-09-08
  • 打赏
  • 举报
回复
你关于openMP的认识是错误的,openMP当然可以和MMX/SSE之类向量指令一起用。

比如你有一个AxA大小的矩阵,用SSE2的处理可以让你处理两个矩阵的加法的运算次数减少到(A*A)/4此

但是如果你有两个内核,用openMP, MPI/PVM/BSP (如果运算非加法,能使得粒度更大),完全继续并行相关的运算。
bluesen 2006-09-05
  • 打赏
  • 举报
回复
我的产品在一开始就创建了上千个线程,每个线程相当于一个虚拟机,解释Koodoo脚本并运行,直到整个结束时才关闭全部线程。
http://www.bluespace.com.cn/koodoo/
各位有兴趣可以评论一下。
BlueTrees 2006-08-31
  • 打赏
  • 举报
回复
如果每个线程中的计算量不大,却反复建立删除线程

这个你可以参考线程池,windows封装了一组API实现线程池,你可以自己自己实现,比较考验你的能力。

同步对象,是必须的,主要用在访问共享数据上,如果是仅仅读写,那么原子操作就可以满足不需要特别的同步,但是,问题出在,程序的执行顺序上,如果程序需要依靠共享数据为条件来改变执行分支的,就必须在分支前保护,在完成所有可能分支后去掉保护。这是没办法的事情。
zalyer 2006-08-30
  • 打赏
  • 举报
回复
写的很好,虽然我不太懂。哈哈。学习
stonesky 2006-08-20
  • 打赏
  • 举报
回复
帮顶一下

我做有时效要求服务端设计比较多

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧