我已经在多线程版本中实现了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:
- 所有线程总和输入的一个子集;
- 同步;
- 然后每个线程累积来自其他线程的部分结果;
- 主线程将所有线程的中间值相加,然后确定是否继续。
分析没有帮助。我不确定哪些数据有助于理解我的代码 - 请只问。
真的让我感到困惑。
这种情况下的输入是什么?有什么IO限制?你有没有测量每个单独的步骤? – 2011-05-13 06:02:02
是否有可能有更多的线程,每个线程都得到足够小的块来在一个时间片内完成?有些调度系统会在第一个切片中为线程留出一点额外时间。如果它没有及时完成,它就会被安排并参与正常切片。如果工作被分解到真正简单的级别,那么您可以通过为应用程序获取更多切片并盗取其他进程来“游戏系统”。你也可以尝试以更高的优先级运行,看看你是否得到类似的结果。 – 2011-05-13 14:52:13
输入全部在开始时读入,所以没有IO界限。我重写了多线程代码的很大一部分,并删除了一个错误共享的实例。虚假分享修复会稍微提高速度。 – laurencer 2011-05-14 09:39:19