首页 > 解决方案 > 内存对齐与 CPU 利用率

问题描述

我有一个运行 Linux 的 ARM 平台,其中 L1 行长 64 字节。

我决定用另一个 malloc 替换 malloc(通过 LD_PRELOAD),无论分配给 malloc 的大小如何,内存都必须是 64 字节对齐。

我期待看到内存消耗增加(实际上发生了),同时看到 CPU 利用率下降。这没有发生。换句话说,内存和 CPU 利用率都上升了。

这怎么解释?

谢谢,

标签: clinuxarm

解决方案


这取决于你是什么malloc()。如果您malloc()用于大块数据,这不会产生真正的差异。但是如果你malloc()的元素小于 64 字节,你可能不会有效地使用缓存。

malloc()按程序顺序分配内存中的元素。如果多个malloc()s 接近,元素将位于连续的内存地址中,并且它们很可能会一起使用,因为它们是同时创建的。这就是所谓的空间局部性原理。当然,什么都不能保证,尤其是对于动态分配的数据,但在大多数程序中都会观察到空间局部性。这个原则的实际含义是它允许更好地使用缓存。缓存未命中很昂贵(您必须从内存中获取 64 个字节),但如果您使用靠近内存的元素,则只需支付一次。

因此,如果单独分配的数据位于同一缓存行中,则获取这些元素之一将使您免费获得靠近内存的其他元素。但是,如果每个元素都像修改后的分配器一样占用一个完整的缓存行,那么它就不再正确了。对数据的每次访问都会导致缓存未命中,您的缓存可以保存的数据数量会减少,并且您会有缓存大小减小的印象。总的结果将是您的计算时间增加。


推荐阅读