具有`k`线程的多线程程序运行速度是否比其顺序版本快〜k`倍?

时间:2016-06-26 08:11:07

标签: c++ multithreading hardware

我知道并行程序的瓶颈,包括内存访问速度限制导致多线程程序运行速度低于我们预期的运行时间,甚至比顺序版本慢。我想知道反过来是否可能(如下所述)。

具体来说,我想知道是否存在这样的情况,其中具有k个线程的多线程程序运行速度比同一台机器上的程序的顺序版本快k倍。假设程序的顺序版本需要100秒才能完成任务,而使用5个线程的多线程版本需要10秒才能完成。

我假设两个程序具有相同的算法,相同的数据结构,相同的实现,以及具有相同优化选项的相同编译器。

一种可能的情况可能是硬件可以更好地执行多线程程序,但我不知道这样的硬件(问题是是否存在)。另一种情况可能是较低级别的软件实现。例如,编译器对多线程版本有更好的优化,但实际编译器中是否存在这种情况?

编辑:这个答案的一个迹象是AMD据说在多线程任务上表现更好,而不是单线程任务。但它是如何完成的? (Difference between intel and AMD multithreading

2 个答案:

答案 0 :(得分:1)

绝对可能。我能想到的一个案例是程序

  1. I/O-bound rather than CPU-bound
  2. I / O子系统的缓慢被随机数据访问模式放大,这混淆了pefetching启发式。
  3. 在这种情况下,程序的单线程版本经常被停顿,直到I / O子系统(从RAM,磁盘,数据库等)提供必要的数据。在多线程的情况下,可能发生不同线程的随机数据访问被交织以形成完全可预测的模式(例如,理想的顺序访问),这使得预取启发式能够将I / O子系统的吞吐量提高数量级并且几乎完全消除了I / O等待时间。

    虽然这种奇怪的加速可能是不同线程之间幸运时间的结果,但实际上并不是由于多线程本身的引入,而是可以通过优化数据访问效率的算法来更加确定地实现。但是,在某些情况下,引入一个模仿真实工作线程的数据访问模式的辅助线程更容易,并让助手运行(作为一个信息灵通的预取器)略微领先于工作线程,以便后者不会我必须等待数据。在这些情况下,由于所描述的效果,多线程可以被视为加速程序的真正工具。

答案 1 :(得分:0)

不太可能,但在线程切换昂贵并且线程间通信便宜的系统上可能略有可能。那当然很少见,这两种操作的表现通常是相关的。