2013-03-14 63 views
1

我见过非常类似的问题,但似乎没有提供任何科学评估。我的问题是,我想优化我的Java线程池中用于分形呈现应用程序的线程数。我应该使用多少个线程来渲染图像?

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

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

如果我只有很多电脑有不同数量的核心,我可以通过实验找到自己。不幸的是,我没有这样的奢侈品= [

+0

您的子图像渲染是否都是用CPU完成的,还是还有磁盘访问需要考虑? – 2013-03-14 13:05:28

+0

没有磁盘访问。至于'完全CPU'部分,我现在要扩展我的算法以利用GPU。 – CJxD 2013-03-14 13:19:45

+0

http://stackoverflow.com/questions/13834692/threads-configuration-based-on-no-of-cpu-cores – assylias 2013-03-16 13:50:30

回答

2

通常情况下,理想的情况是每个处理器有一个线程,但前提是此时系统上没有其他CPU负载较重的应用程序正在运行。

这背后的基本原理是线程之间的切换是一个昂贵的操作(关系),因此有效使用多核CPU的最佳方式是避免线程切换,同时仍然给CPU足够的线程以便使用每个内核。可以

Runtime.getRuntime().availableProcessors();

获得

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

对于您要发送给最终用户的应用程序,您可能会考虑将此值用作默认值,但允许它们对其进行更改,因为用户可能希望与其他CPU并行运行程序强烈的应用程序。在这种情况下,他们可能想要减少应用程序产生的线程数量,而不会减慢其他线程数量。

+0

听起来不错,但考虑到Java选择将线程交给哪里,这是否真的可行?保证在所有线程中均衡分配?此外,调度程序可以随意挂起任何这些线程,因此在任何时候,可能只有少数线程正在运行。 – CJxD 2013-03-14 13:23:10