multithreading - 为什么拥有比核心更快的线程?

标签 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

这对我来说毫无意义。基本算法是求和:
  • 所有线程对输入的子集求和;
  • 同步;
  • 然后,每个线程都会累积其他线程的部分结果;
  • 主线程对所有线程的中间值求和,然后确定是否继续。

  • 分析没有帮助。我不确定哪些数据会有助于理解我的代码-请问一下。

    这真的让我感到困惑。

    最佳答案

    故意创建比处理器更多的线程是一种用于利用“备用周期”的标准技术,在这种情况下,线程被阻塞以等待某些事情(无论是I/O,互斥锁还是其他事情),方法是为处理器提供一些其他有用的工作,以便做。

    如果您的线程正在执行I/O,那么这是提高速度的有力竞争者:由于每个线程都在等待I/O,因此处理器可以运行其他线程,直到它们也对I/O都阻塞为止。准备好第一个线程的数据,等等。

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

    关于multithreading - 为什么拥有比核心更快的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5987376/

    相关文章:

    c++ - 使用 pthread 打印二维数组

    c - Pthreads,尝试使用信号量从多个线程打印数字部分

    c - Ptheard 会杀死线程函数中分配的空闲动态内存吗?

    c - 模拟为火车站的 pthread 同步

    multithreading - 根据导入包(PyQt5)中打印的标准输出更新 PyQt 进度条

    python - Dask 计算非常慢

    c# - Array.ForEach() 与 C# 中的标准 for 循环相比如何?

    .net - 在 WinRT 中的 UI 线程上运行代码

    python - 如何编写一个将另一个函数及其参数作为输入的函数,在线程中运行它并在执行后销毁线程?

    arrays - 为什么制作更小的阵列需要更长的时间?