使用多核处理器是否需要多线程算法?

11

我在想,如果我们的算法是顺序执行的,但必须利用多核处理器,那我们是否需要让算法变成多线程?还是说即使我们的算法是顺序的,JVM也会利用多个核心呢?

更新:

相关问题:


2
除了一些简单的学术任务,我认为大多数Java程序都是多线程的。当学生们第一次使用Swing时遇到ConcurrentModificationException时,他们被迫进入一个多线程环境,这总是很有趣听的。 - Tim Bender
4个回答

20

我不相信任何当前的、生产级别的JVM实现会执行自动多线程。它们可能会使用其他核心进行垃圾回收和一些其他的系统维护工作,但如果您的代码按顺序表达,要想自动并行化它并仍然保持精确的语义是很困难的。

也许有一些试图将JIT检测到的尴尬并行的代码区域并行化的实验性/研究性JVM,但对于生产系统,我还没有听说过这样的东西。即使JIT能够检测到这种情况,它的效果可能还不如在设计阶段就为并行性进行编码。 (编写顺序代码时,您可能会做出会意外地妨碍自动并行化的设计决策。)


1
这是否意味着即使您拥有多核处理器,即使是像 Arrays.sort() 这样的内置函数也没有效果,因为排序函数不是为并行执行而设计的? - Emil
1
@Emil:正确 - 当然,除非实现被更改以使用多个线程。 - Jon Skeet
4
即使您的Java程序过于顺序执行,有额外的核心也能让您的主机机器更有效地处理其他工作(文件系统、监控、网络处理)。 - O. Jones
谢谢你的回复:“他们可能会使用其他核心进行垃圾回收...”,现在我知道为什么我的无线程代码会使用所有处理器核心了。 - mulya

5

为了充分利用您可用的多个内核,您的实现需要支持多线程。

整个系统可以为每个正在运行的应用程序或服务使用单个内核。但是,除非另有规定,否则每个运行的应用程序将只使用单个线程/内核。


2
Java不会自动将您的程序分成线程。目前,如果您希望您的代码能够同时在多个核心上运行,您需要通过线程或其他机制告诉计算机如何将代码分解为任务以及程序中任务之间的依赖关系。但是,其他任务可以在其他核心上并发运行,因此如果您同时运行其他东西,则您的程序可能仍然可以在多核处理器上运行得更快。
使您当前的代码可并行化的一种简单方法是使用JOMP来并行化for循环和强大的处理能力,轻松并行化您代码的部分。

1

2
依我看,一个多线程算法会利用多核处理器上的多个核心。但这并不一定意味着它能有效地使用这些核心。如果算法存在并发瓶颈等问题,那么很可能有很多核心在大部分时间内处于空闲状态。 - Stephen C
@Stephen - 谢谢。我同意你的观点。我编辑了我的答案,以添加多线程应用程序的有效性。 - Sachin Shanbhag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接