1

假设需要构建一个需要超快的类似电子表格的引擎,每个单元依赖关系都可以在并行计算分支上。可以为每个并行分支创建线程吗?就内存而言,线程不是很昂贵。您很容易认为,如果有 1000 个公式行甚至 100 万行,您将不得不创建相同数量的线程,这是否现实?

如果这是不现实的,这种情况下是否有替代线程的方法?

4

6 回答 6

3

对于 CPU 密集型任务,最佳线程数通常是相同数量的 CPU。如果您不小心,创建线程的开销可能比线程所做的工作要高得多。

CPU 通常不是主要问题,这毫无价值。通常,内存带宽或缓存利用率更多是一个问题,在这种情况下,有效地写入一个线程可以胜过尝试将工作分配到多个线程。如果每个线程所做的工作都是 CPU 密集型的,并且使用相对较少的内存带宽,那么拥有多个线程会有所帮助。

于 2012-04-29T09:47:12.680 回答
3

在现代 Java 编程中,您应该完全避免使用线程,而是使用执行程序。世界其他地方称它们为工作队列。请参阅Joshua Bloch在Effective Java中的第 68 条。

就个人而言,我非常喜欢 Grand Central Dispatch 的 API。Java 版本称为HawtDispatch。该 API 更简单,并且可以正常工作。

于 2012-04-29T09:54:57.720 回答
2

你最好的选择是Java 中的Task Parallel Library或 Fork/Join Framework。他们确实使用线程,但优化了线程数并将工作项放在工作队列中。他们以非常聪明的方式处理了许多低级优化问题。您只需使用 Parallel.For 等结构即可。

于 2012-04-29T09:26:40.237 回答
1

任务并行库可以帮助您尽可能多地利用 CPU,并为您完成大部分繁重的线程创建工作。

如果您有大量(非常)可并行化的计算,并且您需要绝对最佳的性能,那么您将不得不超越 cpu。还有一些将 LINQ/TPL 与 GPU 相结合的替代方案,例如 MS。加速器和梵天。参见例如Utilizing the GPU with c#

于 2012-04-29T09:35:56.237 回答
1

除了线程之外,唯一想到的是SIMD命令(除非您想使用特殊硬件,这意味着您必须使用较低等级的语言)。您必须使用外部库来处理这些难以访问的处理器/Gaphic Cards 功能。您也可能对 CUDA 或 OpenCL 感兴趣。另一方面,您通常不想像您描述的那样创建那么多线程,您可以使用具有固定或动态线程数量的线程池来管理创建的线程数量并执行队列中的任务。Java 7 中还有一个 Fork/Join 功能,它有助于线程管理。

我想说看看线程池,通过这些你可以平衡由太多线程产生的开销。

由于您正在寻找信息,因此这也可能对线程有所帮助。

于 2012-04-29T09:48:36.310 回答
1

另请查看Ateji PX。它是用于并行化的 java 语言的扩展,可能会对您有所帮助。它是一种商业产品,但同时它已免费提供。

于 2012-04-29T10:01:46.343 回答