【发布时间】: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