我一直在努力更好地了解缓存位置。我制作了 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
循环完成之前不更新来缓解这个问题?
在实践中,我认为编译器可能会优化缓存位置问题?为了讨论,我们假设没有编译器优化怎么样。