我在Matlab中编写了一个计算任务,该任务包括处理大量数据,这些数据在启动时会读入内存。运行时间在几小时到几天之间。该任务是单线程的。
为了运行此任务,我可以使用许多不同的Linux机器。由于任务已经在运行,因此计算机在不同的系统负载下将继续运行,在可预见的将来。所有机器都具有amd64架构,但是它们在物理核心数,虚拟核心数以及CPU模型(包括时钟速度和其他因素)方面有所不同。
我的问题:是否有一种原则性的方法选择一台机器来执行任务,以期尽快完成任务?
以下部分根据Doktoro Reichard的答案进行了更新。
我大致的想法是如何大致了解哪台机器将是最快的,是结合以下两个方面:
(1)估计如果计算机在我的任务中运行,那么它的一部分处理资源将分配给我的任务,我称之为“相对速度”:如果计算机空闲,则按照定义,我的任务将以相对速度1执行。如果当前负载为L,内核数为C,则在我提交任务后,负载将为L + 1,相对执行速度将为R = min(C /(L + 1),1)。min运算符,因为该进程不能利用多个内核。–相对于机器在当前负载下的最佳状态,该计算是否正确地指示了可达到的处理速度?并且,相关的数字C是物理内核的数量还是虚拟内核的数量,由于超线程,虚拟内核的数量是虚拟内核的两倍吗?
(2)根据机器性能指标,估计如果所有机器都处于空闲状态,则在多台机器上相对较快地执行任务的速度。这不应该是时钟速度,但适当选择的基准。
然后根据哪个机器具有最大的乘积(1)和(2)来选择机器。
主要由于计算机的工作方式,这将不会有一个明确的答案,但是我将尝试给出一些指导,以确定如何找出最快的方法。
我将分析您的陈述,以告诉您哪些可以解决,哪些不能解决。
在第一段中,您声明已加载所有数据并从内存中读取所有数据。这对速度很有好处,因为就带宽而言,内存是首屈一指的。如果您的程序使用磁盘(无论是HDD,SSD还是笔驱动器),则可能会成为程序运行速度的瓶颈。
这是由于传输速度。RAM几乎可以直接访问处理器。磁盘必须通过带宽远低于RAM的连接,而对于HDD,则需要考虑一些时间来获取和存储数据。
所使用的操作系统确实对速度产生了一些影响,但可以认为是残留的。
这是一个相关方面。尽管您说的机器使用的是amd64处理器,但是所使用的指令集可能会有一些差异。
例如考虑Opteron和Sempron系列处理器。它们之间的主要区别在于后者具有SSE3支持。
SSE3允许使用更新,更有效的方式处理数据(特别是数组操作),而在较早的指令集中,这些操作将使用效率较低的流程来完成。
因此,在这方面,较新的处理器在设计上会更快,因为它们支持更有效的指令集。
正如您可能会说的,这是棺材中的最后一个钉子。除非您知道每个程序的工作方式,否则无法以线性方式计算计算机的负载。话虽这么说,您可能正在运行10.000个进程,但是却有剩余负载或单个多线程进程浪费了所有处理器时间。
但是...让我们进一步分析。添加进程意味着向底层系统添加某种类型的数据,以使其了解该进程的存在以及应该为其准备多少处理器时间。在这方面,较少的进程可以提高速度,因为内核/处理器可以更好地决定可用的时间。
要考虑的另一件事是内核赋予进程的优先级。具有最高优先级的进程将占用处理器的大部分时间。
您最终可以构想一个系统,该系统可以给予您的进程最大的优先级,并使所有其他进程永远等待,直到您的进程停止。这样,您的处理速度将由CPU决定。
让我们考虑一下要点:内核和CPU时钟速度。
可以想象内核可以将某些进程转移到其他内核。在极限情况下,您的进程可以指定一个完整的核心。在这方面,更多的内核可以使更多的进程同时运行(因此,运行速度更快)。
我对多线程了解不多,所以我会将其留给了解的人。
时钟速度并不是处理器效率的明确指标。基于此,我向您介绍在Apple硬件中使用Intel和PowerPC处理器之间的“战斗”。苹果公司辩称,尽管Intel处理器的处理器速度提高了,但仍首选PowerPC处理器而不是Intel的主要原因是PowerPC的性能更好,因为它们每秒可以处理与其竞争对手相比更多的操作。最后,由于功率问题和其他经济因素,苹果选择了英特尔。
FLOPS(用于每秒浮点运算)是计算机性能的一种度量,特别是在科学计算领域中,这种计算大量使用浮点计算,类似于每秒更旧,更简单的指令。如果您的工作严重依赖于此类操作(对于使用Matlab而言可能),则这可能比时钟速度更好。
但是,这不是一个非常令人费解的数量(因为它取决于您执行的是哪种操作)。我在Overclock.net上找到了一些基准。我指出了这两个:
如您所见,即使速度为两倍的处理器也可能比速度为一半的处理器性能更差。
由于程序处理中涉及的因素不计其数,因此没有一个明确的公式可用来估计运行时间。我总结了一些经验法则(我已尝试按重要性对它们进行排序):
我仍然不太愿意给出一个全面的公式,但是我相信我可以根据您的评论输出给您一个非常非常近似的公式。我不会谈论多线程,因此我将所有内核视为独立的。对于此演示,假定以下内容:
这样,瓶颈将是CPU的容量。因此,对于任何CPU,任何进程的相对负载如下:
R = min(C / N ; 1)
R为相对负载,C为CPU中的内核数量,N为活动进程的数量。但是,这假设系统可以均匀且完美地将所有负载分配到整个内核,这可能并不总是正确的。
在CPU的相对负载下,将其乘以您选择的度量单位(UM)(例如GHz或GFLOPS),然后即可得出该过程可能有多“快”的度量。
Speed = R * UM
因此,使用此公式,您的公式是正确的。但请注意,请注意我必须做出的假设数量。这与实际情况相去甚远。这不会给您确切的数量,而是有根据的猜测。
您的第二点与第一点相同(实际上,您在回答问题时回答了这一点)。简而言之,它是机器的性能指标(如R = 1
),因此这里的问题是如何选择一个。这是您应该自己分析的东西:您可以使用GHz乘以内核数或GFLOPS或两者的某种组合。
有些程序(在写第一个答案时,我应该早已记得)可以在CPU上进行一些基准测试,从中可以得到一些可能有助于您做出决定的值。我有SiSoftware Sandra(在我的较旧版本中具有Processor Arithmetic基准测试),但我想还有其他一些。
在这种情况下,除非您使用不同的度量单位,否则将1)和2)相乘不会有任何区别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句