c - 内存对齐与 CPU 利用率
问题描述
我有一个运行 Linux 的 ARM 平台,其中 L1 行长 64 字节。
我决定用另一个 malloc 替换 malloc(通过 LD_PRELOAD),无论分配给 malloc 的大小如何,内存都必须是 64 字节对齐。
我期待看到内存消耗增加(实际上发生了),同时看到 CPU 利用率下降。这没有发生。换句话说,内存和 CPU 利用率都上升了。
这怎么解释?
谢谢,
解决方案
这取决于你是什么malloc()
。如果您malloc()
用于大块数据,这不会产生真正的差异。但是如果你malloc()
的元素小于 64 字节,你可能不会有效地使用缓存。
malloc()
按程序顺序分配内存中的元素。如果多个malloc()
s 接近,元素将位于连续的内存地址中,并且它们很可能会一起使用,因为它们是同时创建的。这就是所谓的空间局部性原理。当然,什么都不能保证,尤其是对于动态分配的数据,但在大多数程序中都会观察到空间局部性。这个原则的实际含义是它允许更好地使用缓存。缓存未命中很昂贵(您必须从内存中获取 64 个字节),但如果您使用靠近内存的元素,则只需支付一次。
因此,如果单独分配的数据位于同一缓存行中,则获取这些元素之一将使您免费获得靠近内存的其他元素。但是,如果每个元素都像修改后的分配器一样占用一个完整的缓存行,那么它就不再正确了。对数据的每次访问都会导致缓存未命中,您的缓存可以保存的数据数量会减少,并且您会有缓存大小减小的印象。总的结果将是您的计算时间增加。
推荐阅读
- c# - Azure Function 中没有方括号的 C# JSON
- rust - 如何从文件向量创建单个流?
- java - Xamarin.Auth - 导致应用程序崩溃的多个身份验证错误弹出窗口
- node.js - 如何在快递中更新用户的个人资料?
- firebase - NoSuchMethodError:在 null 上调用了 getter 'hash'
- java - 在java中设置log4j默认路径
- node.js - Mongodb检查字符串数组中的任何字符串是否存在另一个字符串
- python - Python:如何从包含列表作为值的字典列表中制作 DataFrame
- r - 在R中为年龄范围创建年龄分层表
- javascript - 如何在javascript中按日期名称对数组进行排序?