不同乘法大小的Fortran matmul函数的时间

时间:2019-06-30 12:19:31

标签: time fortran

我已经计算出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()测量了时间,两者给出的结果非常相似。

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

2 个答案:

答案 0 :(得分:2)

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

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

在这些大小和更大的尺寸下,计算机必须执行更多典型的操作(加载数据,执行操作,将数据保存到RAM),这就是随着数据变得更大而获得的性能。随着数据的增长,性能也变得非常稳定。请注意,从4096到8192的距离几乎要长8倍。此时,到达16384几乎需要406秒的8倍。

任何小于4096的大小都无法为计算机提供足够的工作来准确地测量性能。

答案 1 :(得分:1)

每个定时之间应该有8的因数,并且偏差通常是由于内存管理(例如缓存对齐和缓存与数组大小之比)引起的。对于小型阵列,可能会有matmul()的调用开销。三重do循环可以更快,至少要进行一些优化(尝试-O3 -march=native),并且对于小尺寸也应该同样有效。