我已经计算出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处理器
答案 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
),并且对于小尺寸也应该同样有效。