2014-10-29 50 views
-2

我想调用一个函数并测量该函数使用的数据缓存内存量。在C或C++或基于Linux的系统中的任何库中是否有任何过程?测量缓存内存使用率

要测量一次,它是像

start = timestamp(); 
proc() 
end = timestamp(); 
proctime = end - start; 
+1

它必须是内置到缓存中的东西,以及如何隔离缓存使用情况与系统中运行的所有其他软件的使用情况。 – 2014-10-29 18:56:46

+0

它必须是内置到缓存中的东西,以及如何隔离缓存使用情况与系统中运行的所有其他软件的使用情况。 – 2014-10-29 18:56:50

回答

1

简短的回答:

没有模拟处理器,它可能无法做到。

龙答:

在用户模式,在任何现代的操作系统,你将无法得到这种类型的数据。您可以使用oprofileperf来获得缓存命中&未命中数字 - 不幸的是,它不会准确地告诉您有多少是由您的进程造成的,以及系统中其他进程有多少(因为处理器具有处理器全局的,并且该工具不知道何时进程被切入/切出,只有“计数器达到触发值时运行哪个进程”)。

换句话说,这将给出统计数字,而不是实际的数字,正是你想要衡量的。此外,它实际上并不会告诉您是否使用1%或100%的缓存,相比于缓存中有多少数据不在缓存中,您使用的是多少数据 - 如果您真的很聪明,你可能会写一些获得95%缓存未命中的东西,但只使用少量的缓存行[但是需要一些实际上在一个或多个具有N * cache_size距离的内存块中实际使用正确地址的工作它们之间]。

然而,这是一个非常可行的模型,用于确定“我的代码是否有缓存未命中问题”。

我不知道任何方法来实际做你想要什么,除了极端方法:

  1. 将一个内核模块中的代码。
  2. 禁用所有中断。
  3. 设置性能计数器以计算数据L1,L2等的缓存命中/未命中。
  4. 运行您要测试的功能。
  5. 收集结果。

变成巨大的不切实际,因为代码将无法做到这一点被换出任何I/O或存取存储器,以及操作系统可能会生气,如果中断是关闭超过一个较长几毫秒...

链接到“PERF”项目Linux内核: https://perf.wiki.kernel.org/index.php/Main_Page 如果你有一个合理的新的内核,这将是你的一般衡量业绩理想工具。