gpt4 book ai didi

performance - 循环的并行版本不比串行版本快

转载 作者:行者123 更新时间:2023-12-04 20:24:31 24 4
gpt4 key购买 nike

我正在用 C++ 编写一个程序来执行特定系统的模拟。对于每个时间步,执行的最大部分被单个循环占用。幸运的是,这是令人尴尬的并行,所以我决定使用 Boost Threads 来并行化它(我在 2 核机器上运行)。我希望加速接近串行版本的 2 倍,因为没有锁定。但是我发现根本没有加速。

我实现了循环的并行版本,如下所示:

  • 唤醒两个线程(它们被阻塞在屏障上)。
  • 然后每个线程执行以下操作:
  • 以原子方式获取并增加全局计数器。
  • 检索具有该索引的粒子。
  • 对该粒子执行计算,将结果存储在单独的数组
  • 等待工作完成障碍
  • 主线程等待作业完成屏障。

  • 我使用这种方法是因为它应该提供良好的负载平衡(因为每个计算可能需要不同的时间)。我真的很好奇可能导致这种放缓的原因。我总是读到原子变量很快,但现在我开始怀疑它们是否有性能成本。

    如果有人有一些想法要寻找什么或任何提示,我将不胜感激。一个星期以来,我一直在抨击它,但分析并没有透露太多信息。

    编辑:问题解决了!
    我将详细说明我是如何解决这个问题的。我再次使用了 gprof,但这次编译时没有使用优化标志 (-O3)。分析器立即指出,我在对每个单独粒子执行计算的函数中花费了难以置信的时间:比串行版本多得多。

    这个函数是虚拟的并且可以多态访问。我更改了代码以直接访问它,而不是通过 vtable 和瞧,并行版本产生了近 2 的加速!对串行版本的相同更改几乎没有影响。

    我不确定为什么会这样,如果有人知道,我会很感兴趣!

    感谢所有的海报。你们都在某种程度上有所帮助,很难接受一个答案。

    最佳答案

    Perform the computation on that particle, storing the result in a separate array



    计算量有多大?
  • 一般而言,原子计数器可能会花费数百个时钟周期,因此非常重要
    看到你不仅增加了计数器。
  • 还要尝试查看每个线程做了多少工作 - 它们是否合作良好(即在每个循环中每个线程进行大约一半的粒子)。
  • 尝试将作业分割为更大的块,然后再分割为单个粒子(比如 100 个粒子等等)。
  • 查看在线程之外完成了多少工作。

  • 老实说......看起来你在说什么是一个错误。

    关于performance - 循环的并行版本不比串行版本快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2636746/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com