我已经在多线程版本中实现了PageRank版本。我正在4核Q6600上运行它。当我运行它来创建4个线程时,我得到:
real 6.968s
user 26.020s
sys 0.050s
当我使用128个线程运行时,我得到:
real 0.545s
user 1.330s
sys 0.040s
这对我来说毫无意义。基本算法是求和:
分析没有帮助。我不确定哪些数据会有助于理解我的代码-请问一下。
这真的让我感到困惑。
最佳答案
故意创建比处理器更多的线程是一种用于利用“备用周期”的标准技术,在这种情况下,线程被阻塞以等待某些事情(无论是I/O,互斥锁还是其他事情),方法是为处理器提供一些其他有用的工作,以便做。
如果您的线程正在执行I/O,那么这是提高速度的有力竞争者:由于每个线程都在等待I/O,因此处理器可以运行其他线程,直到它们也对I/O都阻塞为止。准备好第一个线程的数据,等等。
加快速度的另一个可能原因是您的线程遇到了错误共享。如果您有两个线程在同一高速缓存行(例如,数组的相邻元素)上将数据写入不同的值,则这将阻塞CPU,同时来回传输高速缓存行。通过添加更多线程,可以降低它们在相邻元素上运行的可能性,从而减少错误共享的机会。您可以通过在数据元素上添加额外的填充来轻松地对此进行测试,以使它们各自的大小至少为64个字节(典型的缓存行大小)。如果您的4线程代码加快了速度,那就是问题所在。
关于multithreading - 为什么拥有比核心更快的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5987376/