我应该使用几个核心进行计算?#cores或#cores -1?


12

我有一个很大的计算要做。虽然我可以使用所有内核,但我认为有什么理由放弃1个内核而不使用它?(仅计算cpu没有IO)。还是我低估了即使我使用所有内核也不知道要处理的操作系统,并且无法进行适当的上下文切换?


8
利用所有内核是一个好的开始,关于使用“ -1内核”表现更好的操作系统的一些迷信可能只是-迷信,但您实际上应该对其进行概要分析,了解其在计算,硬件,操作系统方面的表现。
布朗

在许多情况下,使用#cores + 1很有意义。如果仅使用#cores,则任何意外阻止(例如页面错误)都将不必要地迫使内核处于空闲状态。
大卫·史瓦兹

Answers:


28

主要的操作系统已经足够成熟,足以知道如何处理使用每个可用核心的进程。其他进程可能(而且经常会)受到影响,但计算不会变慢,因为您使用了每个可用的内核。

核数的选择更多地取决于您在执行计算时打算做其他事情的意图。

如果在台式机上希望能够在计算完成时使用网络浏览器或观看视频,则最好保留一个内核。以同样的方式,如果服务器正在做两件事(例如进行计算以及同时处理和报告其指标),那么为副任务保留内核是一个好主意。

另一方面,如果您的首要任务是尽快进行计算,则必须使用所有内核。


7
现代操作系统的调度策略,在保持互动节目的互动其实还不错,当有高CPU使用率,只要对话节目是不是也用很多的CPU(其中,理所当然的,可与现代臃肿的web应用程序的问题)
James_pic

注意:即使在服务器上,如果您希望能够通过ssh并获得快速的答案,则将内核0保留为空可能会很有用。
Matthieu M.

11

这取决于。

如果计算机专用于此计算,则应使用所有内核- 未使用的计算资源不会加快处理速度

如果您使用的是实时调度程序,非抢占式调度程序或处理器相似性,则应多加注意,因为很容易使所有计算资源中的其他进程无谓地饿死。但是,您必须手动更改这些设置才能出问题,因此默认情况下,在大多数操作系统上都没有问题。

如果机器不专用于计算,则100%的计算可能不是理想的选择。例如,如果您在运行计算时使用网络浏览器。由于机器的负载偶尔会达到100%以上的峰值,因此会感觉很慢。诸如计算之类的面向吞吐量的任务并不会真正减慢速度,但是对延迟敏感的任务(如GUI)将不会很快做出反应。然后明智的做法是仅启动NPROC-1线程/进程进行计算。或者,显式使用比正常任务低的优先级可以解决此问题,在这种情况下,计算应使用NPROC进程以不浪费任何资源。


3
“如果您在计算运行中使用Web浏览器[…],它将感觉很慢。像计算这样的面向吞吐量的任务并不会真正减慢速度,但是对延迟敏感的任务(例如GUI)将不会很快做出反应。 …]显式地使用比正常任务低的优先级可以解决此问题” –这就是为什么在Unix上将进程优先级值称为“ niceness”并使用名为的实用程序进行配置的原因nice
约尔格W¯¯米塔格

2
他们可以做到“从技术上讲,未使用的计算资源不会加快速度”。使用更少的内核可以允许更高的时钟速率,并减少同步,这可能会或可能不会加快速度。
Davidmh '17年

2
除了@Davidmh注释外,通常在CPU端L1 $和L2 $在线程之间一定程度上是共享的,而L3 $在所有套接字上都是共享的,因此使用更多线程可能会增加$ misses的速度,从而减慢进程。特别是如果进程是内存绑定而不是处理器绑定。
Maciej Piechotka,

如果适当地设置线程/进程优先级,则可以减轻后台工作对交互式进程的影响。我在个人计算机上运行分布式计算应用程序已有十多年了;而且由于CPU计算任务的优先级较低,因此使用浏览器和其他普通桌面应用程序的能力不会受到影响。GPU上的资源共享没有那么先进,在后台运行GPU计算时,我偶尔会遇到GPU加速的HTML5视频(没关系的游戏)问题。即使是轻量级的GFX,多线程游戏也可能会出现问题。赢得饥饿线程2+
Dan在Firelight的抚养下

1

由于他的否决,以下是我对@motoDrizzt的同意的谨慎态度,但这确实是我的实际经验-更好的是,甚至超出了实际的内核数量(而不是数千个)。例如,看一下http://www.forkosh.com/images/avoronoi.gif,该3D-voronoi_diagram的每个2D平面都可以独立生成。程序采用nfork = n query_string 属性来“同时” 派生n个平面的计算。

使用四核处理器,完成该图的(用户)时间随着nfork线性减少,直到大约nfork = 8(四个核超线程)。但是超过8点,时间仍然减少,尽管速度较慢。超过约16个,则没有进一步的明显改善。我根本没有分析这种行为,但是将它天真地归因于os(在这种情况下为linux slackware 14.2x64)处理过程,以进一步减少总体空闲时间。


0

最好的选择取决于系统。因此,您要做的是在真实系统上运行两个版本,然后检查系统如何响应。您还可以在系统上使用浏览器,文本编辑器或其他工具吗?使用n个线程而不是n-1时性能会更好吗?如果您将该应用程序与另一个尝试使用所有CPU的应用程序一起运行,会发生什么情况?

然后,您需要考虑超线程。有了四个核心加上超线程,您可以使用8个核心或7个核心。再次,尝试系统的响应能力和完成时间。

最后,考虑将工作分成比线程更多的块。原因是不同的线程将在不同的时间完成工作,然后您需要将一些工作留给更快的线程处理。否则,您将不得不等到最后一个线程完成。

PS。“因为只有一个FPU,所以超线程无法帮助处理FPU密集型代码”。绝对错误。即使有FPU密集型代码,由于延迟,要充分利用FPU也非常困难。超线程之所以有用,是因为有两倍的独立操作可用于调度。


-4

我不知道该怎么写,听起来不像是“不好”,所以请以友好的口吻说好吗?

鉴于一台普通的PC通常已经具有数千个或更多的线程,那么您认为使用8 vs 7会有什么不同呢?:-)

使用尽可能多的线程。而且,如果您不必关心操作系统的响应,并且线程运行了很长时间(超过一秒钟),您甚至可以尝试使用两倍数量的内核。


3
但是,这数千个线程中的大多数都不使用100%CPU,对吗?
Andreas Rejbrand '17

1
使用两倍数量的内核通常不会缩短计算时间。实际上,即使您拥有更多的逻辑核心(通过HyperThreading等,使用更多数量的物理核心)通常也不会有好处(尽管这可能取决于您要执行的确切任务)。资料来源:过去使用MATLAB并行处理的经验。
桑奇斯

1
@Sanchises这是因为超线程利用了准并行指令交织-对分支和内存繁重的代码有效。矩阵计算的FPU非常密集,每个物理核心只有一个FPU,因此超线程无法为您提供帮助。
J ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.