现在的位置: 首页 > 综合 > 正文

多核优化小结

2013年03月30日 ⁄ 综合 ⁄ 共 1396字 ⁄ 字号 评论关闭

    连学带做已经两周了,今天,针对多核的优化终于有效果了。下面把这两周来学习和做项目的经验作一总结:

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

抱歉!评论已关闭.