为什么比核心更多的线程更快?

时间:2011-05-13 04:54:58

标签: multithreading performance pthreads

我在多线程版本中实现了一个PageRank版本。我在4核Q6600上运行它。当我运行它设置为创建4个线程时,我得到:

real    6.968s
user   26.020s
sys     0.050s

当我使用128个线程运行时,我得到:

real    0.545s
user    1.330s
sys     0.040s

这对我没有意义。基本算法是sum-reduce:

  1. 所有线程对输入的子集求和;
  2. 同步;
  3. 然后每个线程累积其他线程的部分结果;
  4. 主线程将所有线程的中间值相加,然后确定是否继续。
  5. 分析没有帮助。我不确定哪些数据有助于理解我的代码 - 请问问。

    真让我感到困惑。

2 个答案:

答案 0 :(得分:10)

故意创建比处理器更多的线程是一种标准技术,用于利用“备用周期”,其中线程被阻塞等待某些东西,无论是I / O,互斥体还是其他东西,通过提供一些其他有用的工作要做的处​​理器。

如果您的线程正在进行I / O,那么这是加速的有力竞争者:当每个线程阻塞等待I / O时,处理器可以运行其他线程,直到它们阻塞I / O为止,希望第一个线程的数据准备就绪,等等。

加速的另一个可能原因是您的主题遇到错误共享。如果有两个线程在同一个高速缓存行上将数据写入不同的值(例如,数组的相邻元素),那么这将阻塞CPU,同时来回传输高速缓存行。通过添加更多线程,可以降低它们对相邻元素进行操作的可能性,从而减少错误共享的可能性。您可以通过向数据元素添加额外的填充来轻松地测试它,因此它们的大小至少为64字节(典型的缓存行大小)。如果你的4线程代码速度加快,那就是问题所在。

答案 1 :(得分:7)

当线程阻塞某些资源(如内存)时,您可能有多余的CPU周期。其他线程可以使用这些CPU周期。我要看的数据是...... 4线程版本是否显示每个核心的100%利用率?如果没有,你就找到了你的备用CPU周期。