【问题标题】:What's a clean way to switch from parallel to sequential evaluation?从并行评估切换到顺序评估的干净方法是什么?
【发布时间】:2014-02-20 02:27:49
【问题描述】:
在分治算法中,如果
- 每一块都足够大,而且
- 目前运行的线程并不多。
简单示例:在归并排序中,给定一个包含 50,000,000 个元素的列表,将前半部分发送给一个线程,将第二部分发送给另一个线程,依此类推几次,但在某个时间点(可能最多在四个在典型的 PC 上分裂,我想),线程开销超过了任何收益。编写代码以从拆分线程过渡到不这样做的最佳方法是什么?
【问题讨论】:
标签:
java
multithreading
parallel-processing
【解决方案1】:
您所面临的问题可以通过使用 Java 的 Fork/Join 框架来解决。 Here is an example。 ForkJoinPool 不会产生很多线程,而是在一些等待时重用它们。 FJP 正是为解决分而治之的问题而创建的。
【解决方案2】:
“将前半部分发送到一个线程而将第二部分发送到另一个线程是有意义的” - 不,因为每个线程的确切时间可能会有所不同。结果,一个线程完成,第二个线程单独继续,从而降低了并行度。
所以要求是:
每一块都足够大,而且数量很多,以保持处理器负载的平衡
目前运行的线程还不是很多,因为很多线程只消耗内存,并不能提高性能。
因此,工作件数 != 线程数。这意味着应该使用线程池。将工作分成几部分与选择线程池的大小无关。一块越大,切换越少,但平衡性越差。根据经验,应该有 >100 个片段,每个片段的执行时间为 1 到 1000 毫秒。线程池的一面是可用处理器的数量,如果工作执行 I/O,则乘以某个因子。