我有自己的多线程C程序,可以根据CPU内核的数量平滑地扩展速度。我可以用1,2,3等线程运行它并获得线性加速..在6核上最高可达5.5x速度Ubuntu Linux机器上的CPU。
我有机会在一个非常高端的Sunfire x4450上运行该程序,其中包含4个四核Xeon处理器,运行Red Hat Enterprise Linux。我热切期待看到16个内核以16个线程运行程序的速度有多快。
但它的运行速度与两个线程相同!
稍后进行了大量的拔毛和调试,我发现我的程序确实在创建所有线程,它们实际上是同时运行的,但是线程本身比它们应该更慢。 2个线程的运行速度比1快1.7倍,但是3个,4个,8个,10个,16个线程的运行速度仅为1.9倍!我可以看到所有线程都在运行(没有停滞或睡眠),它们只是很慢。
为了检查硬件是否有问题,我同时独立地运行了我的程序的第六个副本。他们全速奔跑。真的有16个内核,它们确实全速运行,并且确实有足够的RAM(实际上这台机器有64GB,而且每个进程只使用1GB)。
所以,我的问题是,是否有一些操作系统解释,也许是一些每进程资源限制,它自动缩减线程调度,以防止一个进程占用机器。
线索是:
我的程序无法访问磁盘或网络。它的CPU有限。它的速度在a上线性变化
Ubuntu Linux中的单CPU盒
一个用于1-6线程的hexacore i7。 6
线程实际上是6倍的加速。
我的程序运行速度不会超过
这款16核心Sunfire的速度提升了2倍
Xeon框,适用于任意数量的线程
从2-16。
运行16份
我的程序单线程运行
完美的,所有16个同时运行
全速。
顶部显示1600%的
分配的CPU。 / proc / cpuinfo显示
所有16个核心都以2.9GHz的速度运行
速度(不是低频怠速
1.6GHz)
有48GB的RAM免费,它没有交换。
发生了什么?是否有一些进程CPU限制策略?如果是这样我怎么测量呢?
还有什么可以解释这种行为?
感谢您的解决方案,2010年的伟大至强减速之谜!