多线程性能不升反降?

晓南 发布于 2012/03/29 14:22
阅读 1K+
收藏 0

在P8H67-M的主板上,插i5-2300(确定是四核四线程的,不是双核四线程的),一根4G的内存条。针对一副100M的8bit灰度影像(7680*13824)做Harris特征提取。开了 N 个线程,每个线程做图像的一块(7680*(13824/N))。

测试结果是:

     N             1        2        3        4        6        9       18      27      54

Time(s)   2.74   2.06    2.28   2.41   2.46    2.48   2.46   2.48    2.58

时间肯定是有一点误差的,大概会波动几十ms的样子。虽然N==1的时候跟预想的一样,但本以为 N>=4的时候速度会最快,没想到N==2的时候最快,而且也比N==1时快不了多少。

这说明什么问题呢?“高速缓存”成为了计算效率的瓶颈吗??请高手指点!

 

以下是问题补充:

@晓南:补充,每个线程除了要读取共约(100/N)MB的影像外,还分配了5MB的临时变量空间。是不是太多了? (2012/03/29 14:33)
加载中
2
中山野鬼
中山野鬼

呵呵。没想到还有遇到我老本行的问题。不灌水对不起以前读的书啊。

先从图像算法说起

Harris特征检测,你具体是什么,怎么算的我不清楚。但有点肯定是对这个窗口做二维处理,你切的子图越多,意味着你的边界重复操作越多。是否能理解?也即额外的计算越多。不过这个不是你上面出现计算时间不下降的主要问题。

再从计算机组成说起。首先,你的4G内存应该能容下你的数据,不至于总是SWAP到硬盘上。这个没有问题。但是你要知道,CACHE的工作原理(如果你希望工程级的优化),建议你去读一下 陈怀临的 浅谈CPU cache page-coloring(妈咪和包厢的话题), 以及陈首席的 多核与公厕的悖论原理。或许你对如何多进程运行并发算法有所帮助。

另外,最后建议,图像的多进程计算,不是你的高或宽的某一个做除法。因为图像通常是二维的。为了提高命中效果,应该是高宽同时做切割。 这样保证在局部计算时,你的数据均能在CACHE命中。

0
Yisen
Yisen
如果全部操作都是非阻塞的,那么单线程跟多线程性能没什么差别
0
freish
freish

如果是计算密集型的,线程数与CPU核数一致即可发挥至高性能,否则加大线程数,只会带来较大的线程上下文切换的开销,不会带来任何性能提升

如果是IO密集型的(如从socket获取数据,数据库获取数据等),可以加大线程数

一般,最佳线程数可以这么计算:线程数=CPU核心数/(1-阻塞系数)

阻塞系数就是操作可能阻塞的时间占整个程序的比例,其值在0和1之间

0
晓南
晓南
不是呀,每次看着自己写的单线程程序,只能让4核CPU使用率跑到 25% ,就很纠结。
0
晓南
晓南
嗯,我这个程序是计算密集型的,没有你说的IO操作,但是算法的“计算/访存比”不是很高。为什么线程数==4的时候没有达到最快?是不是因为高速缓存资源有限?
0
小熊猫大暴走
小熊猫大暴走
问题是你的内存够了吗?还有你确定是4个核在运行吗?不会是一个核在跑4个线程,而其他核却闲着?
卖豆浆不卖油条
卖豆浆不卖油条
有道理,编程中的多线程和cpu的多线程不一定是一一对应的,除非专门作并发编程,针对多核(多线程)优化。
0
十一文
十一文

汗 n 多线程 光线程间切换 和cpu缓存脏读 都耗很多资源的。

如果你能把一个线程绑定到一个cpu的内核这样或会高很多。

 

线程不是越多越好。

0
中山野鬼
中山野鬼

引用来自“googler”的答案

问题是你的内存够了吗?还有你确定是4个核在运行吗?不会是一个核在跑4个线程,而其他核却闲着?
一般来看,他的MEM是足够了。不过是否在多进程进入多核时,有效切割了自己独立的计算数据空间就不知道了。另外OS通常会自动分配进程到多核里。毕竟是SMP的嘛。
0
小熊猫大暴走
小熊猫大暴走

引用来自“中山野鬼”的答案

引用来自“googler”的答案

问题是你的内存够了吗?还有你确定是4个核在运行吗?不会是一个核在跑4个线程,而其他核却闲着?
一般来看,他的MEM是足够了。不过是否在多进程进入多核时,有效切割了自己独立的计算数据空间就不知道了。另外OS通常会自动分配进程到多核里。毕竟是SMP的嘛。
0
中山野鬼
中山野鬼

引用来自“十一文”的答案

汗 n 多线程 光线程间切换 和cpu缓存脏读 都耗很多资源的。

如果你能把一个线程绑定到一个cpu的内核这样或会高很多。

 

线程不是越多越好。

这个一般也不是太大的事情。毕竟进程切换相对某个进程独自操作的时间比,还是占很小的一部分的。不然OS里面那么多进程,切换就已经花很多时间了。
返回顶部
顶部