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



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

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

看到这个 2012 年的帖子,有人发布了一个很小的内核模块源代码来禁用通过 asm 缓存。

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

如果确实需要禁用缓存,那就这样吧。

否则,要知道一个过程在用户或系统"周期"方面需要多少时间,那么我会推荐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 就足够了)。然后,在您调用可能需要它的函数之前,它不会被换出。

当然,您仍然可以获得缓存的效果...假设您没有使用不断的代码处理非常大量的数据(而不是循环)。

最新更新