多线程是否会提高单处理器的计算速度

时间:2010-05-18 10:09:57

标签: c# performance multithreading

在单个处理器上,多线程是否会提高计算速度。众所周知,多线程用于提高用户响应能力,并通过分离UI线程和计算线程来实现。但是让我们谈谈控制台应用程序。多线程是否会提高计算速度。当我们通过多线程计算时,我们是否能更快地得到计算结果。

在多核上怎样,多线程是否会提高速度。

请帮帮我。如果您有任何材料可以了解有关线程的更多信息。请发布。

编辑: 我被问到一个问题,在任何给定的时间,只允许一个线程在单个核心上运行。如果是这样,为什么人们在控制台应用程序中使用多线程。

提前致谢, 戒日

12 个答案:

答案 0 :(得分:20)

一般而言,不会加速任何事情。

据推测,总体上正在完成相同的工作,但现在还存在额外线程和上下文切换的开销。

在具有超线程(两个虚拟处理器)的单个处理器上,答案变为“可能”。

最后,即使只有一个CPU,也许某些线程可以推送到GPU或其他硬件?这有点远离“单处理器”场景,但在技术上可以通过单核PC上的多线程实现速度提升。

编辑:您的问题现在提到多核计算机上的多线程应用程序。 同样,一般来说,这将为您的计算提供整体速度提升。 但是,增加(或缺少)将取决于算法的可并行化程度,内存和缓存的争用,以及程序员在编写没有锁定或饥饿问题的并行代码时的技能。

答案 1 :(得分:13)

1个CPU上的几个线程:

    如果继续使用其他线程而不是等待I / O绑定操作,
  • 可能会提高性能
  • 可能会降低性能,如果说线程太多并且工作浪费在上下文切换上

N CPU上的几个线程:

    如果你能够以独立的方式裁减工作并以独立的方式处理工作,
  • 可以提高绩效
  • 如果你严重依赖线程之间的通信,那么
  • 可能会降低性能,而总线就变成了botleneck。

所以实际上它是特定于任务的 - 你可以很容易地将一件事情并行,而对其他人来说几乎是不可能的。也许这对于新人来说有点高级阅读,但在C#世界中有两个很好的资源:

答案 2 :(得分:8)

你的计算是做什么的?如果处理器绑定,您将无法通过使用多线程加速它,但如果由于某种原因您的计算写入磁盘或等待其他类型的IO,您可以使用线程提高性能。但是,当你说“计算”时,我认为你的意思是某种处理器密集型算法,所以添加线程不太可能有所帮助,甚至可以减慢你的速度,因为线程之间的上下文切换会增加额外的工作。

答案 3 :(得分:5)

如果任务是计算绑定的,除非计算可以分成多个独立的部分,否则线程不会使它更快。即便如此,如果您有多个可用内核,您也只能获得任何性能提升。从问题的背景来看,它只会增加开销。

但是,您可能仍希望在单独的线程上运行任何复杂且长时间运行的计算,以使应用程序保持响应。

答案 4 :(得分:1)

不,不,不。

除非您编写并行化代码以利用多核,否则如果您没有其他阻塞函数,它将总是更慢。

答案 5 :(得分:1)

与用户输入示例完全相同,一个线程可能正在等待磁盘操作完成,而其他线程可能需要占用CPU时间。

答案 6 :(得分:1)

如其他答案所述,单核上的多线程不会给你任何额外的性能(尽管有超线程)。但是,如果您的机器运行Nvidia GPU,您应该能够使用CUDA将计算推送到GPU。请参阅http://www.hoopoe-cloud.com/Solutions/CUDA.NET/Default.aspxC#: Perform Operations on GPU, not CPU (Calculate Pi)

答案 7 :(得分:1)

最重要的是。

如果您可以设法同时完成更多工作,而不是让处理器在不同操作之间等待,则在一个处理器上运行多个线程可以提高性能。但是,由于例如同步或处理器过载而无法满足要求,它也可能严重损失性能。

对于多核,线程可以显着提高性能。但是,很大程度上取决于找到热点而不是过度。在任何地方使用线程并且需要同步甚至可以降低性能。使用具有多个核心的线程进行优化需要大量的预研究并计划获得良好的结果。例如,您需要考虑在不同情况下要使用多少线程。您不希望线程等待另一个线程使用的信息。

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf
https://computing.llnl.gov/tutorials/parallel_comp/
https://computing.llnl.gov/tutorials/pthreads/
http://en.wikipedia.org/wiki/Superscalar
http://en.wikipedia.org/wiki/Simultaneous_multithreading

答案 8 :(得分:1)

我一直在使用24个核心服务器进行一些密集的C ++数学模拟运行。如果我在一台服务器的24个核心上并行运行24个单独的模拟,那么我会为每个模拟X秒获得运行时间。

我注意到的奇怪之处在于,当仅运行12次模拟时,使用24个内核中的12个,其他12个内核空闲,然后每个模拟在Y秒的运行时间运行,其中Y更大比X!在查看处理器使用情况的任务管理器图表时,很明显,进程不仅仅依赖于一个核心,而是在多个核心之间交替。也就是说,核心之间的切换使用所有核心会减慢计算过程。

我在运行12次模拟时维护运行时的方法是在侧面运行另外12次“垃圾”模拟,使用剩余的12个核心!

结论:当使用多核时,以100%使用它们,为了降低利用率,运行时间会增加!

答案 9 :(得分:1)

对于单核CPU, 实际上,表现取决于你所指的工作。 在您的情况下,对于CPU进行的计算,在这种情况下,如果您的parentBoard支持OverClocking,它将有所帮助。否则,CPU无法进行比CPU速度更快的计算。

为了多核CPU 正如上面的答案所说,如果设计得当,性能可能会提高,如果所有核心都被充分利用的话。

在单核CPU中,如果线程在用户级实现,那么多线程无关紧要,如果线程中存在阻塞系统调用,就像I / O操作一样。因为内核不了解用户级别的线程。

因此,如果进程执行I / O,那么您可以在内核空间中实现线程,然后可以为不同的作业实现不同的线程。 (这里的答案是基于理论的。)

答案 10 :(得分:0)

如果经过适当设计以利用处理器完成的高速缓存和流水线操作,即使是CPU绑定任务也可以运行更快的多线程。现代处理器花费了大量时间 即使在名义上完全“忙碌”的时候,他们还是大拇指。

想象一个过程非常集中地使用了一小块内存。处理 相同的内存块1000次将比处理1000个块快得多 相似的记忆。

你当然可以设计一个比单个线程更快的多线程程序。

答案 11 :(得分:0)

踏板不会提高性能。线程牺牲性能,有利于保持部分代码响应

唯一的例外是,如果您正在进行可并行化的计算,则可以在不同的核心上运行不同的线程(这是例外,而不是规则)。