多线程是否等于CPU?

时间:2011-10-03 20:27:33

标签: c# multithreading cpu-usage

我有一小部分我想要处理的大文件,这让我想到了......

在C#中,我考虑使用Parallel.ForEach TPL来利用现代多核CPU,但我的问题更像是一个假设的角色;

在实用中使用多线程是否意味着并行加载文件需要更长的时间(使用尽可能多的CPU内核),而不是按顺序加载每个文件(但可能使用较少的CPU)利用率)?

或以另一种方式(

多线程有什么意义?更多任务并行但速度较慢,而不是一次将所有计算资源集中在一项任务上?

6 个答案:

答案 0 :(得分:4)

为了不增加延迟,并行计算程序通常每个核心只创建一个线程。非纯计算的应用程序倾向于添加更多线程,因此可运行线程的数量是内核数量(其他线程处于I / O等待状态,而不是竞争CPU时间)。

现在,磁盘I / O绑定程序的并行性可能会导致性能下降,如果磁盘具有不可忽略的查找时间,则会浪费更多时间执行搜索并减少实际读取的时间。这被称为“搅动”或“颠簸”。电梯分类有所帮助,真正的随机访问(如固态存储器)有助于提供更多功能。

并行性几乎总能增加完成的原始工作总量,但这只有在电池寿命至关重要时才会发挥作用(当您考虑其他组件使用的电源时,例如屏幕背光,更快地完成)总体来说效率更高。)

答案 1 :(得分:3)

对于从磁盘加载文件,这可能会使的速度变慢。操作系统会尝试在磁盘上布置文件,以便您只需要为每个文件执行一次昂贵的磁盘搜索。如果你有很多线程读取大量文件,你会争论哪个线程可以访问磁盘,并且每次下一个线程获得时你都必须回到文件中的正确位置转动。

你能做的就是使用两个主题。设置一个以在后台加载所有文件,并让另一个文件可用于其他任务,例如处理用户输入。在C#winforms中,您可以使用BackgroundWorker控件轻松完成此操作。

答案 2 :(得分:3)

你问过多个问题,所以我把我的回答分解为多个答案:

  1. 多线程可能对加载速度没有影响,具体取决于加载过程中的瓶颈。如果您从磁盘或数据库加载大量数据,I / O可能是您的限制因素。另一方面,如果“加载”涉及使用某些数据执行大量CPU工作,则可能会因使用多线程而加速。

  2. 一般来说,您无法将“所有计算资源都集中在一项任务上”。一些多核处理器能够超频单个内核以换取禁用其他内核,但这种速度提升并不等于使用多线程/多处理充分利用所有内核所带来的潜在性能优势。换句话说,它是不对称的 - 如果你有一个4核1Ghz CPU,它将无法将单个核心一直超频到4ghz以换取禁用其他核心。事实上,这就是这个行业首先走向多核的原因 - 至少目前我们已经达到了制造单CPU运行速度的限制,所以我们已经走了添加更多CPU的道路。

  3. 多线程有两个原因。首先,您希望任务同时运行,因为两者都希望能够同时发生 - 例如你希望你的GUI在进行其他工作时继续响应点击或键盘按下(事件循环是实现此目的的另一种方式)。第二是利用多个内核来提升性能。

答案 3 :(得分:2)

多线程对高度可并行化的任务非常有用。 CPU密集型任务是完美的。您的CPU有许多内核,许多线程可以使用多个内核。他们将使用更多的CPU时间,但最终他们将使用更少的“用户”时间。如果您的应用程序受I / O限制,那么多线程并不总是解决方案(但它可以提供帮助)

答案 4 :(得分:1)

首先要了解多线程和并行性之间的区别可能会有所帮助,因为我经常会看到它们被相互交替使用。 Joseph Albahari撰写了一篇关于该主题的非常有趣的指南:Threading in C# - Part 5 - Parallelism

答案 5 :(得分:0)

与所有优秀的编程工作一样,取决于。总的来说,你将从一个物理商店或一个物理控制器请求文件,无论如何都会将请求序列化(或者更糟糕的是,在经典硬盘驱动器上来回导致很多头部)并减慢已经缓慢的I / O.

OTOH,如果控制器和介质是分开的,则应通过顺序方法改进从中加载数据的多个核心。