不同乘法大小的 Fortran matmul 函数的次数

标签 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() 测量了时间,两者都给出了非常相似的结果。

我的处理器是 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/

相关文章:

fortran - Fortran 格式描述符的问题

fortran - 在主程序和函数中使用一致的精度

string - 从字符串中删除时区或在 coldfusion 中格式化 HTTP TIME STRING

r - 使用小时更改 bin 大小 :Minute In ggplot histogram

r - R 中日期重叠的按天求和的时间间隔数据

Makefile:Intel fortran,文件夹中的源文件,和 Intel Math Kernel Library

从 fortran 调用 C(ifort、gfortran)

c - 使 visual studio FORTRAN-C 混合代码 gfortran-gcc 兼容的最小修改

java - Android 使用真正的 unix 时间

r - 如何从 strptime() 中仅提取时间?