我正在尝试此 wiki here 中的一些矩阵乘法优化。在测量简单的三重循环 matmul 的 GFLOP/s 时,我预计在特定大小之后会看到 GFLOP/s 下降,根据 wiki,这代表数据停止适合缓存的点:
我在两台不同的 PC 上运行了基准测试:
第三代 Intel i5 (3210M):(L1=每核 32KB,L2=每核 256KB,L3=3MB 共享)。
我得到了预期的图表,从 ~2GFLOP/s 急剧下降到 0.5。第六代 Intel i7 (6500U):(L1=每核 32KB,L2=每核 256KB,L3=4MB 共享)
对此,我反而看到 GFLOP/s 逐渐减少,即使我尝试更大的尺寸。查看 Ubuntu 系统监视器,其中一个 CPU 核心始终处于 100% 使用率。
我正在尝试理解以下内容:
- 如何解释 GFLOP/s 随矩阵大小的变化?如果预期的下降对应于不再适合缓存的数据,为什么即使 i7 上的尺寸更大,我也看不到这样的下降?
- 第三代 i5 如何在尺寸较小的情况下实现更快的性能?
- 如何解读 CPU 占用率?如果花费更多时间从缓存/RAM 获取数据,我会看到 CPU 使用率减少吗?
编辑:
我从 float
切换到 double
并尝试了 -O3
和 -O0
,以下是绘图。我无法检查 odler i5 上的频率,但 Skylake i7 在大部分过程持续时间内几乎立即进入涡轮频率。
代码来自 here ,在 i7 上使用 GCC 7.4.0,在 i5 上使用 clang(Apple LLVM 7)。
最佳答案
关于问题2: 虽然这两款 CPU 具有相同的基本频率和睿频频率,但 Ivy Bridge 的 TDP 为 35W,而 Skylake 为 15W。即使采用更新的流程,Ivy Bridge 也有可能使用其涡轮进行更大部分的计算。 (彼得·科德斯已经提到检查实际的涡轮机。)。
关于问题3: CPU 利用率并不取决于 CPU 正在做什么,等待 RAM 仍然算作利用率。您可以查询一些性能计数器,它们会告诉您 Ivy Bridge 是否因为更频繁地停止获取内存而变慢。
关于performance - 如何解释矩阵乘法 GFLOP/s 中的这种差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57037137/