【问题标题】:times of the Fortran matmul function with different multiplication sizes不同乘法大小的 Fortran matmul 函数的次数
【发布时间】:2019-11-11 11:13:52
【问题描述】:

我计算了 Fortran 的 MATMUL 函数在不同乘法大小(32 × 32、64 × 64...)下所花费的时间,我对结果有疑问。

这些是结果:

SIZE ----- TIME IN SECONDS
32   -----   0,000071
64   -----   0,000032
128  -----   0,001889
256  -----   0,010866
512  -----   0,043
1024 -----   0,336
2048 -----   2,878
4096 -----  51,932
8192 ----- 405,921856

我想时间应该增加 8 倍(m * 2 * n * 2 * k * 2)。我不知道它是否应该是这样的。如果是这样,谁能说出为什么不是这样?

此外,我们看到增加了 18 倍,乘以 2048 a 4096. 谁能告诉我为什么?

我用 Fortran 的 CALL CPU_TIME() 和 Fortran 的 CALL DATE_AND_TIME() 测量了时间,两者都给出了非常相似的结果。

我的处理器是具有 4 核的 AMD Phenom (tm) II X4 945 处理器

【问题讨论】:

  • 编译器名称、版本和编译选项?数组的数据类型?内存大小?由于缓存不足,您可能会遇到内存流量延迟。一些编译器可以选择使用经过特别优化的 MATMUL,它可以提供帮助(尤其是多核)。如上所述,您的问题忽略了许多可能产生影响的因素。
  • 这有点相关:What is cache friendly code
  • 这里有另一个有趣的答案:How to optimize matrix multiplication on a single core

标签: time fortran


【解决方案1】:

@Steve 是正确的,有很多因素会影响性能,尤其是在数据量较小的情况下。这就是为什么您在 2048 年及以下的所有结果几乎都是半随机的,并且基本上是不相关的。所有或大部分数据都可能在几层 CPU 缓存中。因此,刷新 CPU 线程和其他与硬件相关的事件使这些结果非常倾斜。如果您再次运行这些测试,您会发现这些小尺寸的结果不同。

因此,当您从 2048 转到 4096 时,您会获得一个重大的飞跃。所有数据不再适合 CPU 缓存。计算机需要将数据块从 RAM 加载到 CPU 缓存中。这解释了时间上的巨大跳跃。

在这些尺寸和更大的尺寸下,计算机必须执行更典型的操作(加载数据、执行操作、将数据保存到 RAM),这是随着数据变得更大而您将获得的性能。这也是随着数据变得越来越大,性能变得非常一致的地方。请注意,从 4096 到 8192 的时间非常接近正好 8 倍。此时,到达 16384 几乎需要 8 次 406 秒。

任何小于 4096 的尺寸都无法让您的计算机完成足够的工作来准确测量性能。

【讨论】:

    【解决方案2】:

    每个时序之间应该有 8 个因子,偏差通常是由于内存管理(如缓存对齐和缓存与数组大小)造成的。对于小型数组,可能会有调用 matmul() 的开销。三重do-loop 可以更快,至少通过一些优化(尝试-O3 -march=native),并且应该同样适用于小尺寸。

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多