【问题标题】:Will Multi threading increase the speed of the calculation on Single Processor多线程会提高单处理器上的计算速度吗
【发布时间】:2010-05-18 10:09:57
【问题描述】:

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

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

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

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

提前致谢, 哈沙

【问题讨论】:

  • 多线程的历史比多核要长。

标签: c# performance multithreading


【解决方案1】:

一般来说,不,它不会加速任何事情。

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

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

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

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

【讨论】:

  • 请注意,这适用于 CPU 密集型任务,对于执行阻塞操作(IO 绑定/与数据库通信等)的任务,多线程可以加快速度,尽管执行异步或非阻塞操作可以加快速度事情更进一步,但并非所有 api 都有非阻塞变体,而且那些变体可能更难编程。
  • 这并不完全正确,毕竟无论硬件是什么,并行编译几乎总是更快
【解决方案2】:

1 个 CPU 上的线程数很少:

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

N 个 CPU 上的线程很少:

  • 如果您能够将作业切割成独立的块并以独立的方式处理它们,则可能会提高性能
  • 如果您严重依赖线程之间的通信,可能会降低性能,并且总线会成为瓶颈。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • +1 对于响应能力,如果用户可以在进行大型计算时与应用程序交互并执行其他操作,应用程序可能会显示得更快。
      【解决方案5】:

      不,不,不。

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

      【讨论】:

      • 正如@coxymla 指出的那样,可能有一个带有超线程的CPU。这实际上可能会提高执行速度,即使 CPU 只有一个内核。
      • 感谢您的回复,让我们暂时忘记多核。有人问过我这样的问题,如果计算速度不快,那么我们在单核上是否有多线程。我已经向他们解释过,多线程用于响应性、通信相关、数据库相关的工作。但是很多人认为多线程可以提高计算速度。想知道怎么做。感谢您的宝贵时间。
      • @Harsha, @leppie:超线程适用于单核。它使用 CPU“空闲”时间进行伪并行执行。来自en.wikipedia.org/wiki/Hyperthreading:当没有超线程的处理器中的当前任务不会使用执行资源时,特别是当处理器停止时,配备超线程的处理器可以使用这些执行资源来执行另一个计划任务。 (处理器可能会由于缓存未命中、分支预测错误或数据依赖性而停止。)
      • @leppie,这真的取决于他们将在那里使用的算法类型。一些算法可以拆分成多个独立的计算“分支”,这样在多核场景下整个过程可以得到很大的提升。除非我们知道具体情况,否则我不会直接将其简化为“不”。
      • @Artiom Chilaru:我明白你在说什么,但我认为我的回答中涵盖了这些方面。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          上面提到最多。

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

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

          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

          【讨论】:

          • 您好 Jakob,感谢您发布答案和 PDF 文件。我有几个请求/问题: 1. 您是否有任何项目文件或源代码,通过它们可以学习单处理器上的多线程以提高性能。如果您对此问题有任何材料或链接。 2.你有任何线程指南,任何链接请发给我。 3. 有没有线程调试工具。感谢您的时间和发布答案。
          • 您好!对不起,我没有任何源代码。决定程序如何工作的大部分因素取决于 CPU 的架构。我没有任何源代码或调试工具,很抱歉,但我已经用更多链接编辑了我的帖子!
          【解决方案9】:

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

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

          我在只运行 12 个模拟时维护运行时的方式是,使用剩余的 12 个内核在旁边运行另外 12 个“垃圾”模拟!

          结论:使用多核时,全部100%使用,利用率越低,运行时间越长!

          【讨论】:

          • 该开销似乎来自线程移动到另一个核心后的冷缓存。理想情况下,操作系统会知道移动这些线程是没有意义的。
          【解决方案10】:

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

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

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

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

          【讨论】:

            【解决方案11】:

            如果设计得当以利用处理器完成的高速缓存和流水线,即使是 CPU 密集型任务也可能在多线程下运行得更快。现代处理器花费大量时间 摆弄他们的拇指,即使名义上完全“忙”。

            想象一个非常密集地使用一小块内存的进程。加工 同一块内存 1000 次将比处理 1000 块快得多 类似的记忆。

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

            【讨论】:

              【解决方案12】:

              踏板不会提高性能。线程牺牲性能以支持保持部分代码响应

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

              【讨论】:

                猜你喜欢
                • 2020-09-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-10-19
                相关资源
                最近更新 更多