2012-03-09 22 views
9

假设我只有4个内核,测量程序加速的最佳方法是什么?很明显,我可以测量到4,但如果知道8,16等等,这将是很好的。如何测量我的多线程代码如何缩放(加速)?

理想我想知道每个线程的数量增速的量,类似于该图:

Amdahl's law diagram

有没有什么办法可以做到这一点?也许一种模拟多核的方法?

+4

+1对于视觉效果。简而言之,你无法做出有根据的猜测。 – Mysticial 2012-03-09 22:51:07

+0

@Mysticial,但你不应该用英特尔的VTune之类的工具来衡量吗? – 2012-03-10 02:30:13

+0

@ConradFrix不是当你试图猜测你没有的16核上的性能时。另一方面,您可以使用VTune来分析4个内核的性能,并根据这些数字尝试推断为16个内核。那或多或少是一种“受过教育的猜测”。 – Mysticial 2012-03-10 02:32:31

回答

2

我不认为有一个真正的方法来做到这一点,但我想到的一件事是,你可以使用虚拟机来模拟更多的核心。例如,在VirtualBox中,您最多可以从标准菜单中选择16个核心,但我确信存在一些黑客攻击,可以使更多虚拟机和VMware等其他虚拟机甚至可以支持更多的开箱即用功能。

enter image description here

+0

virtualbox如何模拟更多内核? – CMCDragonkai 2015-03-04 08:17:46

+0

@CMCDragonkai嗯,这是虚拟化。它可以告诉客户操作系统,无论它想要什么。 – inf 2015-03-04 08:23:11

+0

然后它是否将这些模拟内核穿入真实的物理内核?所以,如果我有4个内核,那么我可以使用VirtualBox创建100个模拟内核?我没有这样的能力! – CMCDragonkai 2015-03-04 08:26:28

1

我不相信这是可能的,因为有太多的变量,能够准确地推断服务表现。即使假设你是100%平行的。还有其他因素,例如公交车速度和缓存未命中可能会限制您的表现,更不用说表演的表现了。所有这些因素如何影响您的代码只能通过在您的特定硬件平台上进行测量来完成。

2

bamboon和多伦和是正确的,很多变量在起作用,但如果你有一个可调输入大小n,你可以计算出强缩放弱缩放你的代码

强扩展指的是修复问题大小(例如n = 1M)并改变可用于计算的线程数。弱缩放指的是修复每个线程(n = 10k/thread)的问题大小并改变可用于计算的线程的数量。

确实在任何程序中都有很多变量在工作 - 但是如果你有一些基本的输入大小n,就有可能得到一些缩放比例。在几年前我开发的一个n体模拟器上,我改变了固定大小的线程和每个线程的输入大小,并能够合理地计算出多线程代码缩放程度的粗略度量。

由于您只有4个内核,因此只能切实计算最多4个线程的扩展。这严重限制了您查看扩展到大量线程负载的能力。但是,如果您的应用程序仅用于核心数量较少的机器上,则这可能不是问题。

你真的需要问自己这个问题:这是要在10,20,40多个线程上使用吗?如果是这样,准确确定这些制度的缩放比例的唯一方法就是在具有可用硬件的平台上进行实际基准测试。


边注:根据您的应用程序,它可能并不重要,你只拥有4个核心。如果许多线程花费时间“等待”发生某些事情(例如Web服务器),则某些工作负载会随着线程的增加而扩展,而不管可用内核的实际数量是多少。如果你正在做纯计算,情况并非如此

+0

我认为[Amdahl's law](http://en.wikipedia。org/wiki/Amdahl's_law)仅适用于消耗CPU时间的任务。 – 2012-03-10 02:24:13

3

对不起,但在我看来,唯一可靠的测量是实际获得一个8,16或更多的核心机器和测试那。内存带宽饱和,CPU功能单元数量和其他硬件瓶颈可能会对可伸缩性产生巨大影响。我从个人经验中知道,如果一个程序在2个内核和4个内核上扩展,在8个内核上运行时可能会显着减慢,仅仅因为8个内核无法扩展到8个内核是不够的。

你可以尝试预测会发生什么,但也有很多需要考虑到的因素:

  1. 缓存 - 尺寸,层数,共享/非共享
  2. 内存带宽
  3. 核心数量与处理器数量即它是8核心机器还是双核心机器
  4. 核心之间的互连 - 较少数量的核心(2,4)仍可以合理工作还有一条总线,但是对于8个或更多内核来说,这是一个更复杂的互连离子是需要的。
  5. 内存访问 - 再次,较少数量的内核与SMP(对称多处理器)模型很好地工作,而较大数量的内核需要NUMA(非统一内存访问)模型。
1

我认为你是在问测量,所以我不会解决预测对较高数量内核的影响问题。

可以用另一种方式来看待这个问题:您可以保持每个线程的繁忙程度,以及它们总计达到什么程度?因此,对于六个线程,每个线程使用50%的利用率,意味着您有3个相同的处理器正在运行。除以4个处理器,意味着您的方法实现了75%的利用率。将实际利用率与实际加速时钟相比较,可以告诉您利用率有多少是新的开销,以及实际加速的数量。这不是你真正感兴趣的吗?

处理器利用率可以通过几种不同的方式实时计算。线程可以独立地询问系统的线程时间,计算比率并保持全局总计。如果您可以完全控制阻塞状态,则您甚至不需要系统调用,因为您可以跟踪阻塞机器周期与非阻塞机器周期的比率,以计算利用率。我开发的实时多线程工具包使用这种方法,并且它们运行良好。更新的cpus中的cpu时钟计数器在20个机器周期内读取。