使用多线程是否会增加你的CPU使用率?< / h1 >



我对多线程的概念很陌生,但我对多线程架构的整体理解(我了解到有硬件多线程和软件多线程;不是说我完全理解每一个概念,但我认为我在这里谈论的硬件方面)是"保持你的CPU忙碌"。例如,当当前任务正在获取硬盘进行数据导入时,可以处理另一个任务。

如果我是正确的,对于一个非多线程的CPU,如果它已经有接近100%的使用率,那么切换到一个多线程不会帮助你太多。我说的对吗?

我确信我对这个问题的陈述有很多不准确之处,但我希望我让大家理解了我的意思。

你的任务是建造一所房子,你的团队由你、主管和一群工人组成。

当你的老板来检查进度时,你想让他看到什么?一个人做所有的工作,另一个人看着,还是所有的工人都很忙?

你想让工人忙起来,给他们独立的任务,工人越多,这就越难。此外,还有一些问题需要考虑:工人A被赋予建造一堵墙的任务,并且它正在建造它。在墙变得太高之前,混凝土需要干燥,所以A花了很多时间等待。在等待期间,他们可以在其他地方提供帮助。
要求A在建造墙的步骤中帮助其他地方是没有意义的,他们要么需要拒绝,要么停止他们正在做的事情。
无论如何你都不会得到任何好处。


工作线程相当于线程。
房屋建设相当于一个多线程进程。
构建墙的Aworker相当于CPU有界进程,一个进程可以根据需要使用CPU。
混凝土干燥相当于一个IO操作,它不需要任何工人就能自己完成。
等待混凝土干燥的Aworker相当于IO受限进程,它基本上什么都不做。
一个总是忙碌的worker相当于一个最优调度/多线程算法。


现在给你的任务是学习一本CS书,你的团队由你、一个不会阅读的学生和一群读者组成。

你会如何分配读者?你不能让他们单独阅读每一章,因为你不能听一个以上的人。

所以即使你有很多工人,你选择一个,让他们依次阅读这本书。

阅读一本书是一个固有的顺序问题的例子,它不会从多线程中受益,而建造一所房子是一个非常并行化的问题的例子。


处理多个工人并不容易:工人a可能会启动一堵墙,因为他们看了看混凝土储藏库,意识到有足够的,但没有要求它。工人B需要一些混凝土并从仓库中取出,现在A不再有足够的混凝土。
这相当于一个竞争条件:a是在两个不同的时间(作为两个不同的、可分割的操作)检查和使用资源,其结果取决于工作线程的时间。


如果你认为CPU是"可以做事情的单元",你会意识到有更多的"可以做事情的单元"是更好的,只有当它们不是站在那里盯着无限。
因此有了所有关于多线程的文献。

我最初误解了这个问题。当我们将一些算法并行化,在多个线程中进行计算时,您的说法对软件多线程是正确的。在这种情况下,如果您的CPU已经加载了工作,您无法通过在多个线程中执行代码来提高它的工作速度。此外,由于多线程通信和上下文切换的开销,您甚至可以预期性能会下降。但是在现代世界,要找到一个单核CPU并不容易(嵌入式应用除外)。所以在大多数情况下,你需要使用线程来充分利用CPU的计算能力。

但是对于硬件多线程的情况是不同的,因为它是一个完全不同的事情。CPU有执行算术运算的电路和负责程序流的电路。现在我们做一个小技巧:我们将第二个电路的数目加倍,让它们共享算术运算电路。现在两个线程可以执行不同的同时命令:它们不能同时做求和,但一个可以加数字,另一个可以除法。这就是获得性能的方式。所以100%的负载现在是不同的负载,因为你在CPU中启用了额外的电路。相对值相同,但绝对性能更高。

最新更新