1

我见过非常相似的问题,但似乎没有一个提供任何科学评估。我的问题是我想优化 Java 线程池中用于分形渲染应用程序的线程数。

通过将图像分割成子图像,我能够同时渲染每个子图像是完全独立的。

所以我的想法是根据处理器中可用线程的数量制作一个固定的线程池。然后每个线程可以渲染一个或多个子图像。如果我这样做,我应该使用什么比例的线程与子图像?有没有更好的方法来分担负载?

如果我有很多具有不同内核数量的计算机,我可以通过实验自己找到答案。不幸的是我没有这种奢侈=[

4

1 回答 1

2

在目前系统上没有运行其他 CPU 密集型应用程序的前提下,每个处理器拥有一个线程通常是理想的。

这背后的基本原理是线程之间的切换是一项昂贵的操作(相对而言),因此有效使用多核 CPU 的最佳方法是避免线程切换,同时仍为 CPU 提供足够的线程以便利用每个内核。

系统的CPU核数可以通过

Runtime.getRuntime().availableProcessors();

在具有超线程的系统上,这将为您提供虚拟 CPU 的数量,而不是物理 CPU 的数量。当您为每个虚拟内核运行一个线程而不是每个物理内核运行一个线程时,每个线程可能需要更长的时间才能完成,但总体而言,它们可以同时完成更多工作,因为 CPU 的内部资源可以得到更有效的利用。因此,您应该为每个虚拟核心运行一个,除非每个单独的线程尽可能快地完成对您很重要(在这种情况下,您可能会考虑使用单线程,因为执行单线程的多核英特尔 CPU 会超频它的核心运行并在核心之间切换,以便其他核心冷却)。

对于要交付给最终用户的应用程序,您可能会考虑将此值用作默认值,但允许他们更改它,因为用户可能希望与其他 CPU 密集型应用程序并行运行您的程序。在这种情况下,他们可能希望减少您的应用程序产生的线程数,以免减慢其他线程的速度。

于 2013-03-14T13:03:10.353 回答