Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 大数据量时缓存抖动效应减小_Algorithm_Memory_Memory Management - Fatal编程技术网

Algorithm 大数据量时缓存抖动效应减小

Algorithm 大数据量时缓存抖动效应减小,algorithm,memory,memory-management,Algorithm,Memory,Memory Management,当我对大小为2^n的矩阵应用简单算法(矩阵乘法、LU分解等)时,我可以观察到缓存抖动的影响:基本上,在大小为2^k的矩阵上存在时间峰值。但是,对于不断增长的2^n值,这种现象不再得到验证(比如大小=2^14x2^14=16384x16384)。 这是因为什么 编辑 在matlab中运行一些非常简单的实验,我得到以下结果: >> n = 1024; >> AA = rand(n); >> tic; lu(AA); toc; Elapsed time is 0

当我对大小为2^n的矩阵应用简单算法(矩阵乘法、LU分解等)时,我可以观察到缓存抖动的影响:基本上,在大小为2^k的矩阵上存在时间峰值。但是,对于不断增长的2^n值,这种现象不再得到验证(比如大小=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实现也是如此

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

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

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

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

对于1k矩阵,情况有所不同。它只需要8M的存储空间,相当于最近奔腾微体系结构中三级缓存的大小。大多数未命中都是由于冲突而不是容量造成的,并且会发生2^k矩阵的缓存破坏效应


最后一句话。您不应该只使用rand()进行基准测试。这样,rand就不会成为种子,您的数据实际上是随机的。但数值算法的执行时间在某种程度上取决于数据值,这将破坏基准的准确性。使用rng(种子)之前,总是有相同的序列,并做几个测试

如果我们不知道您到底在做什么,很难说。我读到(很早以前,不幸的是,再也找不到了),缓存抖动无法验证数据大小是否很大。可能是因为当数据太大以至于缓存被填满时,寻址过程(这基本上就是缓存抖动)导致的相同缓存线的频繁加载和卸载不再发生,因此数据大小为2^n的这些时间峰值不再存在(?)。无论如何,我通过添加一些细节来编辑我的问题。