我有一个运行Linux的ARM平台,其中L1行的长度为64bytes。
我决定用另一个malloc替换malloc(通过LD_PRELOAD),其中无论给定malloc的大小如何,内存都必须对齐64字节。
我期望看到CPU利用率下降时,内存消耗增加(实际上发生了)。这没有发生。换句话说,内存和Cpu利用率均上升。
这怎么解释?
谢谢
答案 0 :(得分:3)
这取决于您的malloc()
。如果将malloc()
用于大块数据,则不应有任何实际差异。但是,如果您malloc()
个小于64字节的元素,则可能无法有效使用缓存。
malloc()
按照程序顺序在内存中分配元素。如果多个malloc()
关闭,则元素将位于连续的内存地址中,并且有可能将它们同时使用,因为它们是同时创建的。这就是所谓的spatial locality原理。当然,不能保证任何事情,尤其是对于动态分配的数据,但是在大多数程序中都可以观察到空间局部性。该原理的实际含义是它可以更好地使用缓存。高速缓存未命中的代价很高(您必须从内存中获取64个字节),但是如果使用内存中接近的元素,则只需支付一次即可。
因此,如果单独分配的数据在同一高速缓存行中,则获取这些元素之一将使您免费获得其他靠近内存的元素。但是,如果每个元素都像修改后的分配器一样占用完整的缓存行,则不再适用。每次对数据的访问都会导致高速缓存未命中,高速缓存可以容纳的数据数量将减少,并且您会感到高速缓存的大小减小了。总的结果将是您的计算时间增加。