如何解决缓存位置注意事项
我一直在尝试更好地了解缓存的位置。我制作了这两个代码段,以更好地了解两者的缓存位置特征。
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 举报,一经查实,本站将立刻删除。