Answers:
主要的操作系统已经足够成熟,足以知道如何处理使用每个可用核心的进程。其他进程可能(而且经常会)受到影响,但计算不会变慢,因为您使用了每个可用的内核。
核数的选择更多地取决于您在执行计算时打算做其他事情的意图。
如果在台式机上希望能够在计算完成时使用网络浏览器或观看视频,则最好保留一个内核。以同样的方式,如果服务器正在做两件事(例如进行计算以及同时处理和报告其指标),那么为副任务保留内核是一个好主意。
另一方面,如果您的首要任务是尽快进行计算,则必须使用所有内核。
这取决于。
如果计算机专用于此计算,则应使用所有内核- 未使用的计算资源不会加快处理速度。
如果您使用的是实时调度程序,非抢占式调度程序或处理器相似性,则应多加注意,因为很容易使所有计算资源中的其他进程无谓地饿死。但是,您必须手动更改这些设置才能出问题,因此默认情况下,在大多数操作系统上都没有问题。
如果机器不专用于计算,则100%的计算可能不是理想的选择。例如,如果您在运行计算时使用网络浏览器。由于机器的负载偶尔会达到100%以上的峰值,因此会感觉很慢。诸如计算之类的面向吞吐量的任务并不会真正减慢速度,但是对延迟敏感的任务(如GUI)将不会很快做出反应。然后明智的做法是仅启动NPROC-1线程/进程进行计算。或者,显式使用比正常任务低的优先级可以解决此问题,在这种情况下,计算应使用NPROC进程以不浪费任何资源。
nice
。
由于他的否决,以下是我对@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)处理过程,以进一步减少总体空闲时间。
最好的选择取决于系统。因此,您要做的是在真实系统上运行两个版本,然后检查系统如何响应。您还可以在系统上使用浏览器,文本编辑器或其他工具吗?使用n个线程而不是n-1时性能会更好吗?如果您将该应用程序与另一个尝试使用所有CPU的应用程序一起运行,会发生什么情况?
然后,您需要考虑超线程。有了四个核心加上超线程,您可以使用8个核心或7个核心。再次,尝试系统的响应能力和完成时间。
最后,考虑将工作分成比线程更多的块。原因是不同的线程将在不同的时间完成工作,然后您需要将一些工作留给更快的线程处理。否则,您将不得不等到最后一个线程完成。
PS。“因为只有一个FPU,所以超线程无法帮助处理FPU密集型代码”。绝对错误。即使有FPU密集型代码,由于延迟,要充分利用FPU也非常困难。超线程之所以有用,是因为有两倍的独立操作可用于调度。
我不知道该怎么写,听起来不像是“不好”,所以请以友好的口吻说好吗?
鉴于一台普通的PC通常已经具有数千个或更多的线程,那么您认为使用8 vs 7会有什么不同呢?:-)
使用尽可能多的线程。而且,如果您不必关心操作系统的响应,并且线程运行了很长时间(超过一秒钟),您甚至可以尝试使用两倍数量的内核。