现代计算机有越来越多的核心。我们想改变我们目前的线性算法来使用这些核心。
只有在有空闲处理器的情况下,将任何算法拆分为使用不同的线程才有意义。
如果有免费的处理器,有什么好的库可以帮助并行化某些步骤吗?
我会举出一些例子。
抽象算法分为A、B、C和D四个步骤,步骤A、B和C可以并行执行。步骤D需要A、B和C的结果。
编辑:我指的是数学算法。没有IO,没有事件等
发布于 2009-03-14 22:01:34
我认为你需要一个ConcurrentContext从爪哇。见http://javolution.org/target/site/apidocs/javolution/context/ConcurrentContext.html
发布于 2009-03-14 20:55:02
这不一定是真的。
根据算法的不同,将其分割成多个线程通常是有意义的,即使只有一个可用的核心。如果有任何等待套接字,IO等,您可以从中受益。如果有两个进程,“其他”进程可能不会使用100%的另一个核心,所以线程在这里会有所帮助。在这种情况下,相信您的操作系统能够正确地处理它。
您可以始终使用Runtime.availableProcessors()检查处理器计数,以确定如何将其拆分为不同的线程。或者,您也可以使用线程池,该线程池应该可以使用更多的处理器进行正确的缩放。
不过,通常情况下,如果算法具有并行化的意义,我会设计您的算法使用多个处理器。大多数系统都会有更多的核心/处理器可用,如果您发现需要的话,以后可以随时调整您的实现。如果进程长时间运行,那么生成线程的开销将是值得的--如果它已经快了,那么它可能更值得考虑其他需要优化的地方。
发布于 2009-03-14 21:17:52
查看Java 5和更高版本中的各种并发类。你很可能想要一个ThreadPoolExecutor - http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html。
ThreadPool的适当值很可能因系统而异,取决于工作负载和硬件架构。使其用户可调。
https://stackoverflow.com/questions/646700
复制相似问题