在C中,如果你有这种类型的循环:
for (i = 0; i < N; i++)
sum += a[i]
当数组'a‘包含整数(4字节),缓存块可以存储比方说32字节,那么我知道循环每8次迭代就会有一次冷未命中,因为处理器会将8个整数加载到一个块中,然后直到第9次迭代才会得到缓存未命中。我的理解是正确的吗?当它在a获得缓存未命中时,它会将a-a7加载到缓存块中,并且不会再次将任何'a‘加载到缓存中,直到它在a8获得另一次冷未命中
假设^^是正确的,我真正的问题是,如果你有这样的东西会发生什么:
for (i = 0; i < N; i++)
a[i] = a[i+1]
其中'a‘尚未初始化?您会得到类似于上面的代码吗?在上面的代码中,处理器会查找ai+1的每个连续值,并且每隔8个值才会丢失一次。或者它也会在缓存中搜索ai,以便设置值?是否存在与ai相关的缓存未命中,或者仅与ai+1相关
最后,如果你有
for (i = 0; i < N; i++)
b[i] = a[i]
这是否类似于第一个示例,在第一个示例中,它查找ai的每个值并在每8次迭代中获得缓存未命中,或者设置bi的值是否也会导致缓存未命中?
谢谢!
发布于 2019-02-03 13:53:21
这取决于asm代码,你应该先读一读它,看看你的程序是先读取ai还是ai+1。
https://stackoverflow.com/questions/54487360
复制相似问题