在Linux系统上是否有一种禁用CPU缓存(L1/L2)的方法?

4
我正在对一台Linux系统上的代码进行剖析(运行在Intel Core i7 4500U上),以获取仅执行成本的时间。该应用程序为libmpeg2中的演示mpeg2dec。我试图获取mpeg2执行时间的概率分布。然而,我们想要在关闭缓存时看到原始的执行成本。
有没有一种方法可以通过Linux命令或gcc标志禁用系统的CPU缓存?或者甚至将CPU(L1/L2)缓存大小设置为0KB?又或者添加一些更改代码来禁用缓存?当然,这是不需要修改或重建内核的。

我从未见过动态更改CPU缓存大小的指令... - Alexis Wilke
https://unix.stackexchange.com/questions/316684/how-to-disable-processors-l1-and-l2-caches - Ciro Santilli OurBigBook.com
2个回答

3

5
请在回答中总结链接内容,以避免链接失效。如果链接失效,答案对未来读者将毫无用处。 - Toni Leigh

0

如果禁用缓存真的是必要的,那就这样吧。

否则,要知道一个进程在用户或系统“周期”方面需要多少时间,则建议使用getrusage()函数。

struct rusage usage;
getrusage(RUSAGE_SELF, &usage);

你可以在循环/测试之前或之后调用它,并减去这些值,以了解进程所需的时间,即使许多其他进程在同一台机器上并行运行。你可能遇到的主要问题是如果你的进程开始交换,那么你的计时将会失准。

double user_usage = usage.ru_utime.tv_sec + usage.ru_utime.tv_usec / 1000000.0;
double system_uage = usage.ru_stime.tv_sec + usage.ru_stime.tv_usec / 1000000.0;

从我的经验来看,这是非常精确的。为了增加精度,您可以在运行测试时成为root,并给它一个负优先级(-1或-2就足够了)。然后它不会被交换出去,直到您调用可能需要它的函数。

当然,您仍然会得到缓存的效果...假设您没有使用代码处理大量数据并且代码一直运行(而不是循环)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接