0

我一直在努力更好地了解缓存位置。我制作了 2 个代码片段,以更好地了解两者的缓存位置特征。

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;
    }
  }
}

对比

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;
}

在第一个代码v1中,直接在 if 语句中进行更新。这是否会导致缓存局部性问题,因为在更新期间它将用一些连续的数据段替换当前缓存行v1[i] to v1[cache_line_size/double_size]?如果这个分析是正确的,那么这似乎会减慢循环的速度j,因为对于循环的每次迭代j,它都可能有缓存未命中。似乎第二个实现通过使用局部变量并且v1[i]j循环完成之前不更新来缓解这个问题?

在实践中,我认为编译器可能会优化缓存位置问题?为了讨论,我们假设没有编译器优化怎么样。

4

0 回答 0