有没有办法在Linux系统上禁用CPU缓存(L1 / L2)?

时间:2015-03-09 17:48:34

标签: linux caching gcc cpu

我正在分析Linux系统上的一些代码(在Intel Core i7 4500U上运行)以获得仅执行成本的时间。该应用程序是libmpeg2的demo mpeg2dec。我试图获得mpeg2执行时间的概率分布。但是,我们希望在关闭缓存时看到原始执行成本。

有没有办法可以通过Linux命令或gcc标志禁用系统的cpu缓存?甚至将cpu(L1 / L2)缓存大小设置为0KB?甚至添加一些代码更改为禁用缓存?当然,不需要修改或重建内核。

2 个答案:

答案 0 :(得分:3)

参见2012年的帖子,有人发布了一个微小的内核模块源来通过asm禁用缓存。

http://www.linuxquestions.org/questions/linux-kernel-70/disabling-cpu-caches-936077/

答案 1 :(得分: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就足够了。)然后它就不会被换掉,直到你调用一个可能需要它的函数。

当然,您仍然可以获得缓存的效果...假设您不使用代码可以处理大量数据(与循环相反)。