我在 Matlab 中编写了一个计算任务,该任务包括处理启动时读入内存的大量数据。运行时间在几小时到几天之间。该任务是单线程的。
为了运行此任务,我有许多不同的 Linux 机器可供使用。由于已在运行的任务,这些机器的系统负载量不同,这些任务在可预见的未来将继续运行。所有机器都具有 amd64 架构,但它们在物理核心数量、虚拟核心数量和 CPU 型号(包括时钟速度和其他因素)方面有所不同。
我的问题:是否有一个原则性的方法来选择其中一台机器来执行任务,目标是尽快完成任务?
以下部分根据Doktoro Reichard的回答更新。
我粗略地想了一下如何大致了解哪台机器速度最快,就是结合两个方面:
(1) 估计如果一台机器运行我的任务,它会将多大一部分处理资源分配给它,我称之为“相对速度”:如果机器处于空闲状态,根据定义,我的任务将以相对速度 1 执行。如果当前负载为 L,核心数为 C,则在我提交任务后,负载将为 L+1,相对执行速度将为 R = min(C / (L+1), 1)。之所以使用 min 运算符,是因为该过程不能使用多个核心。– 考虑到当前负载,相对于机器可能达到的最佳速度,此计算是否正确?并且,相关数字 C 是物理核心数还是虚拟核心数,后者由于超线程而大两倍?
(2) 根据机器性能指标,估计当所有机器都处于空闲状态时,任务在这些机器上的相对执行速度。这不应该是时钟速度,而是一个适当选择的基准。
然后根据哪台机器具有数字 (1) 和 (2) 的最大乘积来选择机器。
答案1
由于计算机的工作方式,这个问题不会有一个明确的答案,但我会尝试提供一些指导,以找出最快的速度。
我将分析你的陈述,以便告诉你什么是你能弄清楚的,什么是你不能弄清楚的。
1. 数据
从第一段开始,您就表示您将所有数据加载到内存中并从内存中读取。这对提高速度很有帮助,因为就带宽而言,内存是首屈一指的。如果您的程序使用磁盘(无论是 HDD、SSD 还是 U 盘),那么磁盘可能会成为程序运行速度的瓶颈。
这是由于传输速度所致。RAM 几乎可以直接访问处理器。磁盘必须通过带宽远低于 RAM 的连接,而对于 HDD,则需要考虑获取和存储数据所需的时间。
2. 操作系统
所使用的操作系统确实对速度有一定影响,但可以视为残留的。
3. 处理器架构(或指令集)
这是一个相关的方面。虽然您说机器使用的是 amd64 处理器,但所使用的指令集可能存在一些差异。
例如遠龍和闪龙系列处理器。它们之间的一个关键区别在于后者具有3. SSE3 简介支持。
SSE3 允许使用更新、更有效的方式来处理数据(特别是数组操作),这些操作在早期的指令集中需要使用效率较低的流程来完成。
因此,从这个方面来看,更新处理器设计更快,因为它们支持更高效的指令集。
4. 系统负载
您可能会说,这是压垮骆驼的最后一根稻草。除非您知道每个程序的工作原理,否则您无法以线性方式计算计算机中的负载。话虽如此,您可能正在运行 10,000 个进程,但负载仍然很大,或者单个多线程进程浪费了所有处理器时间。
但是……让我们进一步分析一下。添加进程意味着向底层系统添加某种数据,以便它知道进程的存在以及应该为它准备多少处理器时间。在这方面,减少流程是更好的为了速度,因为内核/处理器可以更好地决定提供多少时间。
另一件需要考虑的事情是内核赋予进程的优先级。优先级最高的进程将占用处理器的大部分时间。
您最终可以设想一个系统,该系统可以为您的进程提供最高优先级,并让所有其他进程永远等待,直到您的进程停止。在这种情况下,您的进程速度将由 CPU 决定。
5. 中央处理器
让我们考虑一下您的观点:核心和 CPU 时钟速度。
可以想象内核可以将一些进程转移到其他核心。在极限情况下,您的进程可以分配一个完整的核心。在这方面,更多核心可以使更多进程同时运行(因此,速度更快)。
我不太了解多线程,所以我会把它留给了解的人。
时钟速度不是处理器效率的明确指标。为了证明这一点,我向您展示了苹果硬件中英特尔和 PowerPC 处理器的使用之间的“较量”。苹果辩称,尽管英特尔处理器的处理器速度不断提高,但更喜欢 PowerPC 处理器而不是英特尔的主要原因是 PowerPC 性能更好,因为它们每秒可以处理比竞争对手更多的操作。最终,苹果出于对功耗和其他经济因素的考虑选择了英特尔。
每秒的运算次数(每秒浮点运算次数)是衡量计算机性能的指标,尤其是在大量使用浮点计算的科学计算领域,类似于较旧、较简单的每秒指令数。如果您的工作严重依赖这些类型的操作,那么这可能是比时钟速度更好的衡量标准,对于使用 Matlab 的您来说,这可能是一种可能性。
然而,这并不是一个非常公开的数量(因为它取决于什么样的执行的操作)。我在超频网。我指出这两点:
- AMD Phenom Ix4 9850 @2.83GHz内存 754MHz 5-5-5-15每秒浮点运算次数:27.5
- AMD Phenom IIx2 555 @4.12GHz内存 1000MHz 5-5-5-18每秒浮点运算次数:26
正如您所见,即使速度提高一倍的处理器的性能也可能比速度提高一半的处理器更差。
结论
没有明确的公式由于程序处理过程中涉及的因素无穷无尽,因此您可以使用这些方法来估计运行时间。我总结了一些经验法则(我尝试按以下方式对它们进行排序:重要性):
- 将所有(或大部分使用的)数据放在 RAM 上会更快。(数据存储是任何过程中的主要瓶颈)。
- 同一台机器上运行的进程越少越好。
- 核心越多越好。
- 新型处理器的设计速度更快。
- CPU 速度是粗糙的速度指标(因为 RAM 延迟和其他因素会干扰)
- 您可以要求机器为您的进程赋予最高优先级。机器会尝试分配更多时间到你的流程。(当我说会尝试,我的意思是机器没有义务给你的流程更多的时间,它会试图平衡一切,这就是第二项存在的原因)。
我仍然不太愿意给出一个完整的公式,但我相信我可以给你一个非常非常近似一,基于您的评论输出。我不能谈论多线程,所以我将考虑所有核心都是独立的。对于此演示,假设以下内容:
- 所有进程都有相同的负载。
- 进程并不等待输入/输出。
- 内存速度是假定不是一个因素。
- 所有进程都是单线程的。它们具有相同的优先级。
这样,瓶颈就变成了 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(在我相当旧的版本上,有一个处理器算术基准测试),但我想还有其他。
在这种情况下,将 1) 和 2) 相乘不会产生任何差异,除非您使用不同的测量单位。