我计算了 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)。我不知道是否应该这样。如果是这样,谁能告诉我为什么不是这样呢?
此外,我们看到乘以 2048 a 后增加了 18 倍 4096.有人能告诉我为什么吗?
我使用 Fortran 中的 CALL CPU_TIME()
和 Fortran 中的 CALL DATE_AND_TIME()
测量了时间,两者都给出了非常相似的结果。
我的处理器是 AMD Phenom (tm) II X4 945 4 核处理器
最佳答案
@Steve 是正确的,影响性能的因素有很多,尤其是当数据量较小时。这就是为什么 2048 及以下的所有结果几乎都是半随机的并且基本上不相关。全部或大部分数据可能位于几层 CPU 缓存中。因此,刷新 CPU 线程和其他与硬件相关的事件使这些结果非常不平衡。如果您再次运行这些测试,您会发现这些小尺寸的结果不同。
所以,当你从 2048 到 4096 时,你会得到一个重大的跳跃。所有数据都不再适合 CPU 缓存。计算机需要将数据 block 从 RAM 加载到 CPU 缓存中。这解释了时间上的大幅跳跃。
正是在这些大小和更大的大小下,计算机必须执行更典型的操作(加载数据、执行操作、将数据保存到 RAM),这就是当数据变得更大时您将获得的性能。随着数据变大,这也是性能变得非常一致的地方。请注意,从 4096 到 8192 的长度非常接近恰好是 8 倍。此时,转到 16384 几乎需要 8 乘以 406 秒。
任何小于 4096 的大小都不会为您的计算机提供足够的工作来准确测量性能。
关于不同乘法大小的 Fortran matmul 函数的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824789/