2014-11-21 10 views
0

Afaik:适合并行处理的数据线程的最佳数量是内核数量 - 因为每个线程有(理论上)其核心自己运行。对于具有超线程能力的CPU,它的内核数量是2倍。如果我错了,请纠正我。我可以依赖该操作系统调度线程“最优”(并行化)

我的问题是如果底层操作系统(Linux,Winodws OSX)会自动实现我的“意图”,例如假设我有例如每个线程分配给单个内核。 8个内核和相应的8个线程,其中每个线程在“耗时”任务上工作?

或者相反:是否可以将线程分配给内核(特别是在Java中)?

+0

最佳线程调度除了在极少数情况下np-hard之外,所以没有OS会这样做。现代调度程序非常聪明,如果可能的话,不会将线程从核心移动到核心,因为从高速缓存的角度来看,这非常糟糕。 – Voo 2014-11-21 15:15:23

回答

2

Afaik:适合并行处理的数据的最佳线程数是内核数 - 因为每个线程都有(理论上)自己的核心运行。对于具有超线程能力的CPU,它的内核数量是2倍。如果我错了,请纠正我。

这远比这更复杂。

这取决于您正在优化的内容。如果您正在优化高效(即成本效益)的硬件使用情况,那么它很难达到最佳效果。如果任何线程由于任何原因需要等待很长时间,则线程一对一分配给物理内核会导致内核利用率不足。如果这些核心可以用于别的东西(例如运行某人elses程序!),那么你的使用是不理想的。

即使您仅针对应用程序速度进行优化,但一对一分配并不一定是最佳策略。

  • 根据线程数量,每个应用程序+工作负载都有一个“最佳位置”。这取决于任何内部争用的数量和性质,以及与外部系统(文件系统,网络等)的通信量和性质。

  • 如果你有严格的单线程每核心规则,那么你最多可以在N核心系统上有N个线程。

  • 如果该N显着小于线程的“甜蜜点”数量,那么您可能会发现内核空闲很多时间。

现在用于超线程。

超线程可能会给您每个时钟周期的额外CPU周期。但是,它们在内存系统中不会给你额外的周期。超线程“虚拟核心”的性能特征将与物理核心不同......而对于实际应用,这种差异将是显着的。因此,你的2 x假设是没有根据的。

我的问题是如果底层操作系统(Linux,Winodws OSX)会自动实现我的“意图”,例如假设我有例如每个线程分配给单个内核。 8个内核以及相应的8个线程,其中每个线程都在“耗时”任务上工作?

不一定。

  • 操作系统必须考虑系统上发生的其他事情。其他应用程序,处理您的桌面的守护进程等,处理文件系统和网络协议的东西。

  • OS(和JVM)通常只会对调度决策中已经发生的事情做出反应。根据过去的行为(在这个级别)预测未来的行为不符合成本效益......现代操作系统不会试图去做,除非是在一个非常粗略的/启发式的级别。完美(最优)预测是不可能的,即使你有完美的知识,调度问题也是NP难题。

从理论上讲,应用程序员可以设计一个最佳时间表。实际上,大多数应用程序对于这个过于复杂,并且很难考虑到系统上发生的其他“随机”事件。

或者相反:是否可以将线程分配给内核(特别是在Java中)?

没有切实可行的方法来做到这一点。 (见@ ksmonkey123的答案)当然,不可移植。

反正它可能不太可能在Java中工作。 Java存在隐藏的线程在应用程序背后隐藏线程的问题(例如垃圾收集器和终结器线程),Java内存管理难以预测并且难以调整。