gpt4 book ai didi

c++ - 我如何知道我的阵列存储在哪个缓存级别?

转载 作者:行者123 更新时间:2023-12-01 14:20:16 27 4
gpt4 key购买 nike

我明白,空间和​​时间的局部性对性能有巨大的影响。我不明白的是我的数据结构是如何存储在这些缓存中的?
为简单起见,假设 L1 缓存有 8 个字节,L2 有 16 个字节,L3 缓存有 32 个字节。
这是否意味着如果我们有:

std::array<double, 1> x = {1.}; 
std::array<double, 2> y = {1.,2.};
std::array<double, 4> z = {1.,2.,3.,4.};

还有一些函数调用这些数组,x 会加载到 L1 缓存中,y 会加载到 L2 中,z 会加载到 L3 中吗?
或者将 y - 例如被拆分到 L1 和 L2 缓存?

手动拆分这些数组会在本地产生更好的缓存吗?
例如,如果我这样做:
std::array<std::array<double,2>,2> z;

当函数调用 z 时,它会在缓存级别上拆分吗?

缓存线呢?这些通常是 64 字节长 - 将我的数组拆分为 64 字节数组的数组会产生更好的访问速度吗?
std::array<std::array<double,8>,2> u;

我发现这个主题很困惑,希望得到任何帮助

最佳答案

您正在以错误的方式考虑缓存。

您只能使用特殊工具(想到英特尔调试器)查看哪个缓存具有它们,结果将特定于您的运行和架构。更改处理器可以很容易地破坏您的设置。

也就是说,您可以尝试使用缓存友好的解决方案。

缓存的工作方式是这样的:说你想读你 x[0] .您的程序将请求与其关联的内存位置。它将被L1拦截。如果 L1 可以为您提供值(因为它已经存储在一个块中),它会。如果不是,请求将被 L2 拦截,依此类推。如果没有缓存级别具有该块,则将从 RAM 中请求该块。

现在,从 RAM 中仅读取 4 个字节是低效的,因为存在开销。所以实际上你将从 ram 中读取一个 L3 块,其中包括你想要的字节。您可能必须读取 2 个块,因为您的数据在它们之间拆分(编译器试图避免这种情况)。将 L2 块大小的块发送到 L2 缓存进行存储,将 L1 大小的块发送到 L1,所有这些都包括您想要的字节(字节可能位于中间某处)。对于下一个请求(比如“x[1]”),同样的事情发生。如果下一次访问接近最后一次,那么您可能会从 L1 获得结果。我说可能是因为您的程序可能已在具有不同 L1 的不同内核或处理器上暂停和恢复。

尝试针对特定设置进行设计通常是一个坏主意(除非您确实需要最后几%的性能并且您已经尝试了其他所有方法)。

经验法则是继续访问彼此相邻的内存。要避免的是访问相距很远的几个字节。遍历数组非常快。尝试在同一个排序数组上实现线性搜索和二分搜索,看看数组需要多长时间才能从二分搜索中获得显着更好的性能(上次我去了大约 100 个整数)。

在您的示例中,如果您首先访问 x 的所有元素然后转到 y等等设置都很好。如果您正在访问 x[i], y[i], z[i]然后 x[i+1], y[i+1], z[i+1]那么也许有一个带有 {x,y,z} 的结构并将其放在数组中会更好(您需要进行基准测试才能确定)。

And some function calls these arrays, will x be loaded in the L1 cache, y in L2 and z in L3? Or will y - for example be splitted over the L1 and L2 caches??



它们都将在您访问它们时加载的所有 L1、L2、L3 缓存中。如果您访问的频率足够高,则可以从较低级别的缓存中获取它们。

Will splitting these arrays manualy yield better cache localitly?



不。处理器的内存管理处理 split 。缓存位置取决于您访问内存特定部分的频率。最好将所有访问聚集在一起,而不是随着时间的推移分散开。

What about cachelines? these are usualy 64 bytes long - Will splitting my arrays into arrays of arrays of 64 bytes yield better access speed?



不。您可能看不出任何区别。数组由处理器中的内存管理工具自动拆分。再说一次,不要为您当前的处理器架构过度优化,您明天购买的 CPU 可能具有两倍长的开箱即用的缓存线。

关于c++ - 我如何知道我的阵列存储在哪个缓存级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61982901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com