multithreading是否会提高单处理器的计算速度

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

那么在多核上,multithreading会不会增加速度。

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

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

哈尔莎,提前谢谢

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

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

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

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

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

1个CPU上的几个线程:

  • 如果您继续使用另一个线程而不是等待I / O绑定操作,可能会提高性能
  • 如果假设线程太多并且上下文切换浪费了工作,则可能会降低性能

N CPU上的几个线程:

  • 如果你能够以独立的方式削减工作并以独立的方式处理它们,可能会提高性能
  • 如果你严重依赖线程和总线之间的通信成为一个botleneck可能会降低pefromance。

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

  • Joe Duffy的网络日志
  • PFX团队博客 – 他们在.NET世界中有一系列用于并行编程的文章,包括模式和实践。

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

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

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

不,不,不。

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

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

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

最上面提到的。

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

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

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

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

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

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

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

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

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

在单核CPU中,如果线程在用户级实现,那么如果线程中存在阻塞系统调用(如I / O操作),则multithreading无关紧要。 因为内核不会知道用户级别的线程。

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

如果正确设计利用处理器完成的高速缓冲存储器和流水线操作,即使是CPU绑定任务也可以运行更快的multithreading。 现代处理器花费大量时间摆弄他们的拇指,即使名义上完全“忙”。

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

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

便鞋不会提高性能。 线程牺牲了性能,有利于保持代码的一部分响应

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