Caching 缓存位置注意事项

Caching 缓存位置注意事项,caching,language-agnostic,cache-locality,Caching,Language Agnostic,Cache Locality,我一直在尝试更好地了解缓存位置。我制作了这两个代码片段,以便更好地理解两者的缓存局部性特征 vector<int> v1(1000, some random numbers); vector<int> v2(1000, some random numbers); for(int i = 0; i < v1.size(); ++i) { auto min = INT_MAX; for(int j = 0; j < v2.size(); ++j) {

我一直在尝试更好地了解缓存位置。我制作了这两个代码片段,以便更好地理解两者的缓存局部性特征

vector<int> v1(1000, some random numbers);
vector<int> v2(1000, some random numbers);
for(int i = 0; i < v1.size(); ++i)
{
  auto min = INT_MAX;
  for(int j = 0; j < v2.size(); ++j)
  {
    if(v2[j] < min)
    {
       v1[i] = j;
    }
  }
}
向量v1(1000,一些随机数);
向量v2(1000,一些随机数);
对于(int i=0;i
vs

向量v1(1000,一些随机数);
向量v2(1000,一些随机数);
对于(int i=0;i
在第一个代码中,
v1
直接在if语句中更新。这是否会导致缓存位置问题,因为在更新过程中,它将使用从
v1[i]到v1[cache\u line\u size/double\u size]
的一些连续数据段替换当前缓存线?如果此分析是正确的,那么这似乎会减慢
j
上的循环,因为对于
j
循环的每次迭代,它都可能有缓存未命中。第二个实现似乎通过使用局部变量来缓解这个问题,并且在
j
循环完成之前不更新
v1[i]


实际上,我认为编译器可能会优化缓存局部性问题?为了便于讨论,我们假设不进行编译器优化如何。

注意:编译器可能会注意到内部循环每次都会产生完全相同的结果,将其提升,运行一次并记住结果。然后它需要做的就是用结果的N个元素初始化
v1
line@user4581301哎呀,我不是故意让这个例子这么简单的。我的意思是,它要比这复杂得多,但我不想把注意力从真正的问题上转移开。@user253751缓存线的数量是如何确定的?这是处理器设计的一部分。
vector<int> v1(1000, some random numbers);
vector<int> v2(1000, some random numbers);
for(int i = 0; i < v1.size(); ++i)
{
  auto min = INT_MAX;
  auto loc = -1;
  for(int j = 0; j < v2.size(); ++j)
  {
    if(v2[j] < min)
    {
       loc = j;
    }
  }
  v1[i] = loc;
}