【发布时间】:2014-05-18 05:06:27
【问题描述】:
基于地址的模运算,每个内存地址“映射”到它们自己在 CPU 缓存中的缓存集。
有没有办法访问两个大小相同的数组,像这样:
int* array1; //How does the alignment affect the possibility of cache collisions?
int* array2;
for(int i=0; i<array1.size(); i++){
x = array1[i] * array2[i]; //Can these ever not be loaded in cache at same time?
}
会导致性能下降,因为 array1[i] 和 array2[i] 处的元素给出相同的高速缓存行模结果?或者,这实际上是否会提高性能,因为只需加载一个缓存行即可获得两个数据位置?
有人能举个例子说明由于缓存映射导致的性能变化,包括数组的对齐方式会如何影响这一点吗?
(我提出问题的原因是我试图了解何时由于数据对齐/地址映射到同一缓存行而发生性能问题,这会导致其中一条数据未存储在缓存中)
注意:我可能混淆了缓存“行”和“设置”这两个术语 - 请随时更正。
【问题讨论】:
-
你认为存在两个不能同时缓存的地址a吗?这不是真的。
-
@n.m.从技术上讲,对于 直接映射 缓存,只有两个地址会产生冲突未命中。直接映射的缓存现在即使在嵌入式系统中也很少见,但过去经常使用直接映射。
-
@PaulA.Clayton 谢谢,不知道。
-
如果 array1 和 array2 可以放在同一个缓存行中,那么是的,应该会提高性能,让您的逻辑可以直接访问它们的元素(而不是将它们用作指针并加载在堆因此会污染您的缓存)
标签: c++ performance optimization cpu-architecture cpu-cache