我在多线程版本中实现了一个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:
分析没有帮助。我不确定哪些数据有助于理解我的代码 - 请问问。
真让我感到困惑。
答案 0 :(得分:10)
故意创建比处理器更多的线程是一种标准技术,用于利用“备用周期”,其中线程被阻塞等待某些东西,无论是I / O,互斥体还是其他东西,通过提供一些其他有用的工作要做的处理器。
如果您的线程正在进行I / O,那么这是加速的有力竞争者:当每个线程阻塞等待I / O时,处理器可以运行其他线程,直到它们阻塞I / O为止,希望第一个线程的数据准备就绪,等等。
加速的另一个可能原因是您的主题遇到错误共享。如果有两个线程在同一个高速缓存行上将数据写入不同的值(例如,数组的相邻元素),那么这将阻塞CPU,同时来回传输高速缓存行。通过添加更多线程,可以降低它们对相邻元素进行操作的可能性,从而减少错误共享的可能性。您可以通过向数据元素添加额外的填充来轻松地测试它,因此它们的大小至少为64字节(典型的缓存行大小)。如果你的4线程代码速度加快,那就是问题所在。
答案 1 :(得分:7)
当线程阻塞某些资源(如内存)时,您可能有多余的CPU周期。其他线程可以使用这些CPU周期。我要看的数据是...... 4线程版本是否显示每个核心的100%利用率?如果没有,你就找到了你的备用CPU周期。