- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Cachegrind 检索未使用 libc 编译的静态程序的缓存未命中数(只是调用我的主函数的 _start
和 asm 中的退出系统调用)。该程序是完全确定的,指令和内存引用不会从一次运行到另一次运行发生变化。缓存与 LRU 完全关联作为替换策略。
但是,我注意到未命中数有时会发生变化。更具体地说,在我转到不同的目录之前,未命中的次数始终相同:
% cache=8 && valgrind --tool=cachegrind --I1=$((cache * 64)),$cache,64 --D1=$((cache * 64)),$cache,64 --L2=262144,4096,64 ./adpcm
...
==31352== I refs: 216,145,010
...
==31352== D refs: 130,481,003 (95,186,001 rd + 35,295,002 wr)
==31352== D1 misses: 240,004 ( 150,000 rd + 90,004 wr)
==31352== LLd misses: 31 ( 11 rd + 20 wr)
如果我一次又一次地执行相同的命令,我将一直得到相同的结果。但是如果我从不同的目录运行这个程序:
% cd ..
% cache=8 && valgrind --tool=cachegrind --I1=$((cache * 64)),$cache,64 --D1=$((cache * 64)),$cache,64 --L2=262144,4096,64 ./malardalen2/adpcm
...
==31531== I refs: 216,145,010
...
==31531== D refs: 130,481,003 (95,186,001 rd + 35,295,002 wr)
==31531== D1 misses: 250,004 ( 160,000 rd + 90,004 wr)
==31531== LLd misses: 31 ( 11 rd + 20 wr)
我什至从不同的目录得到了不同的结果。
我还使用 Pin 工具做了一些实验,使用这个工具我不需要更改目录来获得不同的值。但似乎可能的值集非常有限,并且与 Cachegrind 完全相同。
我的问题是:这种差异的根源是什么?
我的第一个提示是我的程序在内存中没有以相同的方式对齐,因此,以前运行时存储在同一行中的一些变量不再存在。这也可以解释组合数量有限的原因。但是我虽然 cachegrind(和 Pin)使用的是虚拟地址,但我假设操作系统(Linux)总是提供相同的虚拟地址。还有其他想法吗?
编辑:正如您在阅读 LLd 未命中时所猜测的那样,该程序仅使用了 31 个不同的缓存行。此外,缓存只能包含 8 个缓存行。因此,即使在真实情况下,这种差异也无法用第二次填充缓存的想法来解释(最多只有 8 行可以保留在 L1 中)。
编辑 2: Cachegrind 的报告并非基于实际的缓存未命中(由性能计数器给出),而是模拟的结果。基本上,它模拟缓存的行为以计算未命中数。由于结果只是暂时的,这完全没问题,并且允许更改缓存属性(大小、关联性)。
编辑 3: 我使用的硬件是 Linux 3.2 x86_64 上的 Intel Core i7。编译标志是 -static 并且对于某些程序 -nostdlib(IIRC,我现在不在家)。
最佳答案
Linux 为安全问题实现了“地址空间布局随机化”技术 (http://en.wikipedia.org/wiki/Address_space_layout_randomization)。您可以像这样停用此行为:
echo -n "0" > /proc/sys/kernel/randomize_va_space
你可以通过这个例子来测试:
#include <stdio.h>
int main() {
char a;
printf("%u\n", &a);
return 0;
}
您应该始终打印相同的值。
之前:
% ./a.out
4006500239
% ./a.out
819175583
% ./a.out
2443759599
% ./a.out
2432498159
之后:
% ./a.out
4294960207
% ./a.out
4294960207
% ./a.out
4294960207
% ./a.out
4294960207
这也解释了不同数量的缓存未命中,因为同一行中的两个变量现在可以位于不同的两行中。
编辑: 这显然没有完全解决问题,但我认为这是原因之一。我会将赏金奖励给任何可以帮助我解决此问题的人。
关于c - 多次运行之间同一程序的不同缓存未命中计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17368670/
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!