如果我有一个启动 X 线程数量的进程,那么 X 高于 CPU 核心(假设所有线程同步工作而没有异步调用存储/网络)?
E.G。如果我有两个核心 CPU ,我是否会放慢启动3+以上不断工作的线程的应用程序?
答案 0 :(得分:1)
这实际上取决于您的代码所做的事情。它太宽泛了。
拥有比核心更多的线程可能会加速程序,例如,如果某些线程休眠或试图阻止锁定。在这种情况下,OS调度程序可以唤醒不同的线程,并且该线程将在另一个线程处于休眠状态时工作。
拥有比核心数更多的线程也可能减少程序执行时间,因为OS调度程序必须做更多的工作来在线程执行之间切换,并且调度可能是一个繁重的操作。
与往常一样,使用不同数量的线程对应用程序进行基准测试是实现最高性能的最佳方法。还有一些算法(比如Hill-Climbing)可以帮助应用程序在运行时微调最佳线程数。
答案 1 :(得分:1)
如果您的线程进行读/写/发送/接收系统调用或类似操作,或者在锁上等等,则运行更多线程是有意义的。
如果您的线程是纯粹的计算线程,那么添加更多线程会因为上下文切换而降低系统速度。
如果您仍需要设计更多线程,您可能需要查看协作式多任务处理。 Windows和Linux都有API,并且比上下文切换工作得更快。在Windows中,它称为光纤:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661(v=vs.85).aspx
在Linux中,它是一组函数make / get / swapcontext():
答案 2 :(得分:1)
有可能发生这样的事情。 英特尔和AMD目前都在其CPU中实现SMT的形式。这意味着,通常,一个执行线程可能无法利用100%的计算资源。 发生这种情况是因为现代CPU以多个流水线步骤执行指令,因此可以增加时钟频率(在每个周期中完成的操作更少,因此您可以执行更多周期)。这种方法的缺点是,如果你有两个连续的指令A和B,后者取决于前者的结果,你可能需要等待一些时钟周期而不做任何事情,只需等待指令A完成。因此,他们提出了SMT,它允许CPU交错来自同一管道上两个不同线程/进程的指令,以填补这些空白。
注意:它不完全是这样,CPU不只是等待。他们试图猜测第一个操作的结果并执行第二个假设结果。如果他们的猜测是错误的,他们会取消待处理的指令并重新开始。此外,它们还有一些反馈电路,可以更严格地执行相互依赖的指令。而现在分支预测器出乎意料地好。如果您可以通过其他进程的指令填补空白,而不是猜测,那么管道就会变得更好,但这可能会使每个执行线程可以使用的缓存量减半。
答案 3 :(得分:1)
这个问题:Optimal number of threads per core可能对您有帮助。
在线程中我编写了一个answer来描述一个场景,当线程数比可用内核数量更多时提升了性能。