我有一个运行Linux的ARM平台,其中L1线长64个字节。
我决定将malloc(通过LD_PRELOAD)替换为另一个malloc,其中内存必须是64字节对齐,无论给予malloc的大小。
我期待看到CPU利用率下降时内存消耗增加(实际发生)。这没有发生。换句话说,内存和CPU利用率都在上升。
怎么解释这个?
谢谢,
这取决于你malloc()
。如果你使用malloc()
获取大块数据,这不应该产生真正的差异。但是如果你的malloc()
元素小于64字节,你可能不会有效地使用缓存。
malloc()
按程序顺序在内存中分配元素。如果几个malloc()
s接近,则元素将位于连续的内存地址中,并且很可能它们将在同时创建时一起使用。这就是所谓的spatial locality原则。当然没有任何保证,特别是对于动态分配的数据,但在大多数程序中都观察到空间局部性。这个原则的实际意义在于它允许更好地使用缓存。缓存未命中是昂贵的(您必须从内存中获取64个字节),但如果您在内存中使用关闭元素,则只需支付一次。
因此,如果单独分配的数据位于同一个缓存行中,则获取其中一个元素将为您带来内存中关闭的其他元素。但是如果每个元素都占用了与修改后的分配器一样的完整缓存行,那么它就不再适用了。每次访问数据都会导致缓存未命中,缓存可以容纳的数据量会减少,您会觉得缓存大小会减少。总结果将是您的计算时间增加。