【问题标题】:Paralellization vs vectorization performance bottlenec: Does AVX and MT compete?并行化与矢量化性能瓶颈:AVX 和 MT 是否竞争?
【发布时间】:2015-07-18 12:28:34
【问题描述】:

我试图计算一个大矩阵中所有元素的总和。以下是测试用例:

  1. MT 和 AVX 需要 37 秒
  2. MT 和无 AVX 需要 40 秒
  3. AVX 和无 MT 需要 49 秒
  4. 既不是 AVX 也不是 MT 105 s

在所有情况下,CPU 时钟都固定为 3.0 GHz(由 cpufreq-info 声明):

current policy: frequency should be within 1.60 GHz and 3.40 GHz.
                The governor "userspace" may decide which speed to use
                 within this range.
current CPU frequency is 3.00 GHz.

矩阵有 25000000 个类型为 double 且值为 1.0 的元素。并且在循环中重复计算总和 4096 次。如果没有 AVX,使用 MT 时的速度提升是 2.6。使用 AVX,它只有 1.3。运行 MT 时,矩阵被分成 4 个块,每个线程一个。如果我降低 CPU 频率,则 AVX 的 MT 改进更大,因此缓存未命中也可能存在一些问题,但这无法解释 (4)/(2) 和 (3)/(1) 之间的区别。 AVX 和 MT 是否以某种方式相互竞争?芯片是i3570K。

【问题讨论】:

    标签: multithreading intel avx


    【解决方案1】:

    您的基准性能很可能受到执行延迟的限制,但任何一种并行化形式(MT 或矢量化)都可以让您打破这一点并达到下一个瓶颈,即 CPU 的内存带宽。

    检查您的 CPU 可以达到的峰值带宽并与您的数据进行比较,看起来您只是以 20.5GB/s 饱和(25000000 个元素 * 4096 个循环 * 8 字节,假设这是您的系统使用的两倍 / ~40 秒) ,这似乎有点低,因为 link 说它应该达到 25GB/s,但大致相同,因此可能是由于其他低效率,如 DDR 类型、其他应用程序/操作系统在后台工作、频率缩放完成由CPU来省电/降低热量等。

    您还可以尝试运行一些内存基准测试(lmbench、sandra、..),看看它们在相同环境下是否表现更好。

    【讨论】:

    • 还值得一试:在适合 L2 缓存的小 (
    • @PeterCordes,好主意,请记住,您将在 BW 之上获得其他几个好处(页表也将更小并适合 TLB,访问延迟也得到改善)。另请注意,在此芯片上,您将获得专用的 L2 缓冲区,这些缓冲区将在您的流之前从内存中预取,尽管自然地作为 L2 驻留仍然更好。
    • 在调整代码时,测试完全缓存的案例以发现其他瓶颈通常很有帮助。所以是的,适合 L2 并完全留在核心内是理想的。如果在您测试更大的缓冲区时没有最大化您的带宽,请调整内存延迟。
    【解决方案2】:

    MT不应该和MT竞争,它们是两个不同的东西。尽管求和的想法很简单,但根据您的实现,您可以获得非常不同的数字。我建议您使用Stream benchmarks 来测试性能,因为它们是标准。我没有看到您的代码,但存在一些问题:

    1. 您正在用 1.0 对所有元素初始化矩阵。我认为这不是一个好主意。您应该使用随机数或至少根据索引进行初始化(例如 (i%10)/10.0)。
    2. 您如何测量时间?您应该将计时器放在重复循环之外,并取重复次数的平均值。您还使用准确的计时器吗?
    3. 您确定您的代码实际上是矢量化的吗?您是否启用了任何编译器标志来显示此信息?您是否确保使用了代码的 AVX 版本?也许编译器选择使用标量版本。
    4. 您提到频率是固定的,您确定在任何时候都没有启用加速模式吗?
    5. 使用 MT 测量时线程亲和性如何?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 2011-11-28
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多