缓存位置注意事项

问题描述

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

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

vs

vector<int> v1(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来缓解此问题?

在实践中,我认为编译器可能会优化掉缓存局部性问题?为了进行讨论,我们假设没有编译器优化。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)