首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教多线程的本质是啥

2012-06-03 
请问多线程的本质是啥?今天下午有个同学说他有个项目每秒处理上万条数据,开销很大,所以他开了好几个线程来

请问多线程的本质是啥?
今天下午有个同学说他有个项目每秒处理上万条数据,开销很大,所以他开了好几个线程来同时完成处理速度才够,我就有点纳闷了,CPU只有一个,多个线程不就是让CPU把时间分段,然后把这些时间段分配给线程吗?但是CPU只有一个啊,开再多的线程对数据的处理速度会有帮助吗?
  难道是多线程的本质我理解错了吗?还是现在的CPU有多核,多线程可以让这个核做这个,那个核做那个,这样效率就提高了?单核多核CPU不一样吗?

[解决办法]
在单核处理器下,如果他的单个处理线程占用CPU为100%的话,那是用多线程只会导致效率降低。
现在是多核处理器,使用多线程可以提高CPU使用率,既提高效率。
还有一种情况就是,单个线程处理数据时有等待现象,导致不能满负荷使用CPU,也可以使用多线程。

[解决办法]
对于对多线程的加速,我做过深入的分析。如果某个线程函数对内存的使用没有达到极限,使用多线程可显著提高总的性能。反之,使用多线程不会提高总体性能。
以下内容摘自我在数学研发论坛发的帖子《求一个数组中元素的最大值和最小值》,更详细的说明和源代码请看http://bbs.emath.ac.cn/thread-2799-1-1.html。


Assembly code
函数getMaxMin1是一个最普通的版本,使用C语言书写,每个数需作2次比较,使用随机数据,CPU的分支预测部件预测成功的概率非常高。故速度很快。getMaxMin_MT2_v1是getMaxMin1的2线程版本,速度提高到单线程版本的200%以上,在误差范围内,速度为单线程版本的2倍,和理论吻合。getMaxMin_MT4_v1是getMaxMin1的4线程版本,速度提高到单线程版本的400%以上,在误差范围内,速度为单线程版本的4倍左右,和理论吻合。函数getMaxMin1_SSE4是一个使用汇编语言书写的版本,不同getMaxMin1_asm,这个函数使用SSE4 指令PMINUD和PMAXUD,一次可求4个DWORD的最大或者最小值,内存读则使用movdqa指令,一次读取4个DWORD,这个版本充分展示了SSE4指令的威力,速度竟达 getMaxMin1_asm 的四倍,几乎吃掉了整个内存带宽。getMaxMin_MT2_v2是getMaxMin1_SSE4的2线程版本,速度仅仅提高13%,一个线程的getMaxMin1_SSE4函数几乎吃到了整个内存带宽,故getMaxMin_MT2_v2性能的提高受限于内存带宽,并没有达到单线程版本的200%。getMaxMin_MT4_v2是getMaxMin1_SSE4的4线程版本,速度和双线程版本getMaxMin_MT2_v2相同。性能的提高受限于内存带宽,并没有达到单线程版本的400%。getMaxMin_MT2_v3是getMaxMin2_asm1的2线程版本,速度为单线程版本的195%,在误差范围内,速度为单线程版本的2倍,和理论吻合。getMaxMin_MT4_v3是getMaxMin2_asm1的4线程版本,性能的提高受限于内存带宽,并没有达到单线程版本的400%。  以下4个多线程版本函数的性能几乎完全相同,而且实际性能都小于理论值,说明 多线程函数的执行单元虽然是独立的,但他们共享相同的物理内存,多线程并行的性能受限于内存的总带宽,当总的内存存取达到物理内存带宽的限制,增加线程数并不能提高实际性能。getMaxMin_MT4_v1:        0.014741 秒getMaxMin_MT2_v2:        0.014625 秒getMaxMin_MT4_v2:        0.014714 秒getMaxMin_MT4_v3:        0.014684 秒 

热点排行