多线程的目的是增加您的 CPU 使用率吗?
Is the point of multi-threading to increase your CPU usage?
我对多线程的概念很陌生,但是以我对多线程架构的整体理解(我了解到有硬件多线程和软件多线程;并不是说我完全理解每个概念,但我想我在这里谈论的是硬件方面)是 "keep your CPU busy"。例如,当您当前的任务正在获取您的硬盘以进行数据导入时,这是为了处理另一项任务。
如果我是正确的,对于非多线程 CPU,如果它已经接近 100% 的使用率,那么切换到多线程对您帮助不大。我说得对吗?
我确信我对问题的陈述充满了不准确,但我希望我让自己明白了。
我最初误解了这个问题。当我们并行化某些算法以在多线程中进行计算时,您的陈述对于软件多线程是正确的。在这种情况下,如果您的 CPU 已经加载了工作,您将无法通过在多个线程中执行代码来使其工作得更快。此外,由于多线程通信和上下文切换的开销,您甚至可以预期性能会下降。但在现代世界中,要找到一个单核 CPU 并不容易(嵌入式应用程序除外)。所以在大多数情况下你需要使用线程来充分发挥CPU的计算能力。
但是对于硬件来说,多线程的情况就不同了,因为它是完全不同的东西。 CPU 有执行算术运算的电路和负责程序流程的电路。现在我们做一个技巧:我们将第二个电路的数量加倍,让它们共享算术运算电路。现在两个线程可以同时执行不同的命令:它们不能同时做求和,但是一个可以加数字,第二个可以除一些东西。这就是获得性能的方式。所以 100% 负载现在是不同的负载,因为您在 CPU 中启用了额外的电路。相对值相同,但绝对性能更高
你接到了盖房子的任务,你的团队由你、主管和一群工人组成。
当你的老板来检查进度时,你希望他看到什么?一个工人做所有的工作而另一个工人看着,还是所有的工人都在忙?
你想让工人忙于给他们独立的任务,工人越多就越难。
此外还有一些问题需要考虑:worker A 被赋予了建造一堵墙的任务,并且它正在建造它。在墙变得太高之前,混凝土需要干燥,所以 A 花了很多时间等待。
在这段等待期间,他们可以在其他地方提供帮助。
当 A 在建造墙的过程中请求其他地方的帮助是毫无意义的,他们要么拒绝要么停止他们正在做的事情。
无论哪种方式,您都不会获得任何好处。
工人相当于线程。
盖房子相当于一个多线程进程。
A 建造墙的工人相当于 CPU 有界进程,一个根据需要使用 CPU 的进程。
混凝土烘干相当于一个IO操作,它会自己完成,不需要任何worker。
A 等待混凝土干燥的工人相当于一个 IO 限界进程,它几乎什么都不做。
A worker 总是很忙相当于一个最优的 scheduling/multi-threaded 算法。
现在给你的任务是学习一本CS书,你的团队由你、一个不识字的学生和一群读者组成。
你会如何分配读者?你不能让他们单独阅读每一章,因为你不能听一个以上的人。
所以即使你有很多工人,你也可以选择一个让他们按顺序阅读这本书。
读书是一个无法从多线程中受益的固有顺序问题的例子,而盖房子是一个非常可并行化的问题的例子。
处理多个工人并不容易:一个工人 A 可能会开始砌墙,因为他们查看了混凝土储藏处并意识到其中有足够的但没有认领它。工人 B 需要一些混凝土并从仓库中取出,现在 A 不再有足够的混凝土。
这相当于竞争条件:A 在两个不同的时间(作为两个不同的、可分割的操作)检查和使用资源,结果取决于工作人员的时间安排。
如果您将 CPU 视为 "units that can do things",您就会意识到拥有更多 "units that can do things" 更好,前提是他们不站在那里凝视着无穷大。
因此,所有关于多线程的文献。
我对多线程的概念很陌生,但是以我对多线程架构的整体理解(我了解到有硬件多线程和软件多线程;并不是说我完全理解每个概念,但我想我在这里谈论的是硬件方面)是 "keep your CPU busy"。例如,当您当前的任务正在获取您的硬盘以进行数据导入时,这是为了处理另一项任务。
如果我是正确的,对于非多线程 CPU,如果它已经接近 100% 的使用率,那么切换到多线程对您帮助不大。我说得对吗?
我确信我对问题的陈述充满了不准确,但我希望我让自己明白了。
我最初误解了这个问题。当我们并行化某些算法以在多线程中进行计算时,您的陈述对于软件多线程是正确的。在这种情况下,如果您的 CPU 已经加载了工作,您将无法通过在多个线程中执行代码来使其工作得更快。此外,由于多线程通信和上下文切换的开销,您甚至可以预期性能会下降。但在现代世界中,要找到一个单核 CPU 并不容易(嵌入式应用程序除外)。所以在大多数情况下你需要使用线程来充分发挥CPU的计算能力。
但是对于硬件来说,多线程的情况就不同了,因为它是完全不同的东西。 CPU 有执行算术运算的电路和负责程序流程的电路。现在我们做一个技巧:我们将第二个电路的数量加倍,让它们共享算术运算电路。现在两个线程可以同时执行不同的命令:它们不能同时做求和,但是一个可以加数字,第二个可以除一些东西。这就是获得性能的方式。所以 100% 负载现在是不同的负载,因为您在 CPU 中启用了额外的电路。相对值相同,但绝对性能更高
你接到了盖房子的任务,你的团队由你、主管和一群工人组成。
当你的老板来检查进度时,你希望他看到什么?一个工人做所有的工作而另一个工人看着,还是所有的工人都在忙?
你想让工人忙于给他们独立的任务,工人越多就越难。
此外还有一些问题需要考虑:worker A 被赋予了建造一堵墙的任务,并且它正在建造它。在墙变得太高之前,混凝土需要干燥,所以 A 花了很多时间等待。
在这段等待期间,他们可以在其他地方提供帮助。
当 A 在建造墙的过程中请求其他地方的帮助是毫无意义的,他们要么拒绝要么停止他们正在做的事情。
无论哪种方式,您都不会获得任何好处。
工人相当于线程。
盖房子相当于一个多线程进程。
A 建造墙的工人相当于 CPU 有界进程,一个根据需要使用 CPU 的进程。
混凝土烘干相当于一个IO操作,它会自己完成,不需要任何worker。
A 等待混凝土干燥的工人相当于一个 IO 限界进程,它几乎什么都不做。
A worker 总是很忙相当于一个最优的 scheduling/multi-threaded 算法。
现在给你的任务是学习一本CS书,你的团队由你、一个不识字的学生和一群读者组成。
你会如何分配读者?你不能让他们单独阅读每一章,因为你不能听一个以上的人。
所以即使你有很多工人,你也可以选择一个让他们按顺序阅读这本书。
读书是一个无法从多线程中受益的固有顺序问题的例子,而盖房子是一个非常可并行化的问题的例子。
处理多个工人并不容易:一个工人 A 可能会开始砌墙,因为他们查看了混凝土储藏处并意识到其中有足够的但没有认领它。工人 B 需要一些混凝土并从仓库中取出,现在 A 不再有足够的混凝土。
这相当于竞争条件:A 在两个不同的时间(作为两个不同的、可分割的操作)检查和使用资源,结果取决于工作人员的时间安排。
如果您将 CPU 视为 "units that can do things",您就会意识到拥有更多 "units that can do things" 更好,前提是他们不站在那里凝视着无穷大。
因此,所有关于多线程的文献。