【问题标题】:Cache Thrashing effect decreases for big data size缓存抖动效应因大数据大小而降低
【发布时间】:2019-01-24 12:26:55
【问题描述】:

当我对大小为 2^n 的矩阵应用简单算法(矩阵乘法、LU 分解等)时,我可以观察到缓存抖动的影响:基本上,在矩阵大小为 2^k 处存在时间峰值。但是,对于 2^n 的增长值,这种现象不再验证(例如 size = 2^14x2^14 = 16384x16384)。
这是因为什么?

编辑
在 matlab 中运行一些非常简单的实验,我得到以下结果:

>> n = 1024;  
>> AA = rand(n);
>> tic; lu(AA); toc;
Elapsed time is 0.163291 seconds.
>> n = 1025;
>> AA = rand(n);
>> tic; lu(AA); toc;
Elapsed time is 0.040935 seconds.

再次进入 2 的下一个幂,缓存抖动得到验证,但不太明显:

>> n = 4096;
>> AA = rand(n);
>> tic; lu(AA); toc;
Elapsed time is 1.208170 seconds.
>> n = 4097;
>> AA = rand(n);
>> tic; lu(AA); toc;
Elapsed time is 1.120656 seconds.

在这台笔记本电脑上,缓存抖动不再验证矩阵大小 = 2^13x2^13:

>> n = 8192;
>> AA = rand(n);
>> tic; lu(AA); toc
Elapsed time is 8.586088 seconds.
>> n = 8193;
>> AA = rand(n);
>> tic; lu(AA); toc;
Elapsed time is 8.676817 seconds.

(我知道这些是随机矩阵,而且时间差很小,但我已经通过许多实验观察到了这种趋势)。 C 实现也是如此。

【问题讨论】:

  • 很难判断我们是否不知道您到底在做什么。
  • 我读过(很久以前,不幸的是,再也找不到它了),当数据大小非常大时,缓存抖动无法验证。也许是因为当数据太大以至于缓存被填满时,不再发生由寻址过程引起的相同缓存行的频繁加载和卸载(这基本上就是缓存抖动的原因),所以这些时间数据大小为 2^n 的峰值不再存在 (?)。无论如何,我通过添加一些细节来编辑我的问题。

标签: algorithm memory memory-management


【解决方案1】:

缓存未命中的三个原因(3C):强制(当数据尚未加载到缓存行中时),冲突(当缓存将数据映射到已占用的行时,而缓存中存在一些空闲空间) 和容量(当所有缓存已满时)。

在缓存中映射数据依赖于地址的二次分解,并解释了为什么大小为 2^k 的矩阵会将其行映射到相同的缓存块,从而导致冲突未命中。目前的计算机试图通过高关联性缓存来克服这个问题,但它仍然会发生。使用 2 矩阵大小的非幂是一种在所有高速缓存块中展开矩阵矩阵并避免此问题的方法。

当矩阵大小增加时,我们会遇到容量缺失。如果您的矩阵不适合缓存,则无论您的矩阵大小是否为 2 的幂,都需要弹出行以读取新行。这就是原因,无论矩阵大小超过某个阈值,您都会有类似的减速。

对于 lu 分解,您需要处理一些 n^2 矩阵。如果算法写得好,在缓存中存储一​​个垫子可以带来一些性能改进。但是,如果你的矩阵是 8kx8k,那么每个矩阵是 512MB,这远远超出了目前计算机中缓存的大小。这与 4k 矩阵 (128MB) 的情况完全相同,您在基准测试中看到的细微差别并不显着。由于当前计算机中的优化在某种程度上是统计性的,因此多次运行相同程序目前会导致运行时间至少有 10-20% 的差异。

对于一个 1k 的矩阵,情况就不同了。它只需要 8M 的存储空间,这是最近 pentium 微架构中 L3 缓存的大小。大多数未命中将是由于冲突而不是容量造成的,并且会发生 2^k 矩阵的缓存垃圾效应。

最后一句话。您不应该只使用 rand() 进行基准测试。这样 rand 不会被播种,您的数据实际上是随机的。但是数值算法的执行时间在某种程度上取决于数据值,这会破坏你的基准测试的准确性。之前使用 rng(seed) 始终具有相同的序列并进行多次测试。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2016-10-29
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多