朋友们,我想研究一下操作系统造成的缓存污染对应用程序性能的影响。
为此,我编写了一个小的自定义基准程序。
1. malloc an array of size = l1 data cache-size
2. repeat ... sweep this array from start to end (hit-rate = 1.0)
3. *** perform a system call that thrashes l1 data cache ***
4. sweep the array once again (expected hit-rate = ~0.7 ---> 1.0)
算法的步骤2重复读取完整的数组。希望数组会留在缓存中,从而导致命中率为1。
在执行系统调用之后,我再次尝试读取缓存。但是我假设操作系统已经清除了属于用户的一些缓存线。
如您所见,该程序依赖于系统调用从l1数据缓存中逐出许多用户数据行。我如何才能做到这一点??
我假设系统调用应该是与文件或流相关的。
发布于 2012-04-24 07:17:09
对L1缓存的影响因系统调用而异。一种方法是遍历几个不同的系统调用,并测量每个系统调用的影响(例如,包括与I/O相关的调用,如write()
,其中您可以改变缓冲区的大小,从而对缓存的可能影响)。
您可能希望避免将系统调用实现为vsyscall(例如gettimeofday()
),因为它们不需要切换到内核空间。参见[1,2]。
听起来您想隔离对L1d的影响,所以您可能需要注意的另一件事是:在第2步中,在循环遍历数组之后,将填充L1i缓存。系统调用完成后,很可能L1d和L1i都受到了污染,因此您可能还会看到i-cache未命中对性能的影响。
要获得更好的细粒度测量,您可以使用硬件性能计数器,具体取决于您的体系结构。
发布于 2019-10-08 17:37:22
我在读Hennessy and Patterson - Thread-level Parallelism - OS and Multiprogramming Workload。显示具有L1-cache高活跃度的示例是一些基准代码的编译。您可能会有一些可以编译的代码,然后在步骤#3中生成该编译,以修改L1缓存。但是,是的,L1i也会被修改。
https://stackoverflow.com/questions/10247072
复制相似问题