performance - 如何解释矩阵乘法 GFLOP/s 中的这种差异?

标签 performance x86 matrix-multiplication cpu-architecture cpu-cache

我正在尝试此 wiki here 中的一些矩阵乘法优化。在测量简单的三重循环 matmul 的 GFLOP/s 时,我预计在特定大小之后会看到 GFLOP/s 下降,根据 wiki,这代表数据停止适合缓存的点:

expected_gflops_drop

我在两台不同的 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% 使用率。

enter image description here

我正在尝试理解以下内容:

  1. 如何解释 GFLOP/s 随矩阵大小的变化?如果预期的下降对应于不再适合缓存的数据,为什么即使 i7 上的尺寸更大,我也看不到这样的下降?
  2. 第三代 i5 如何在尺寸较小的情况下实现更快的性能?
  3. 如何解读 CPU 占用率?如果花费更多时间从缓存/RAM 获取数据,我会看到 CPU 使用率减少吗?

编辑:
我从 float 切换到 double 并尝试了 -O3-O0,以下是绘图。我无法检查 odler i5 上的频率,但 Skylake i7 在大部分过程持续时间内几乎立即进入涡轮频率。
代码来自 here ,在 i7 上使用 GCC 7.4.0,在 i5 上使用 clang(Apple LLVM 7)。

with_O3 with_O0

最佳答案

关于问题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/

相关文章:

java - GSON 序列化非常非常慢

c++ - InterlockedDecrement 使用 XADD 但 InterlockedIncrement 使用 INC?

c++ - 使用特征值的复矩阵矩阵乘法

matlab - 在Matlab中只计算矩阵乘积的对角线

c++ - 如何通过 IO 时序测量找到 L1 缓存线大小的大小?

java - 字符串大写 - 更好的方法

sql - 组织 ID 字段作为复合主键

c++ - Visual Studio 是否发出错误的汇编代码?

c++ - 是否可以使用 SSE 对此嵌套进行矢量化?

c - OpenMP 中的错误,试图为循环向量化矩阵乘法