朋友们,我想研究由于操作系统导致的caching污染对应用程序性能的影响。
为此我写了一个小的定制基准程序。
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)
algorithm的第2步重复读取完整的数组。 希望这个数组会留在caching中,因此命中率为1。
在执行系统调用之后,我尝试再次读取caching。 但我认为操作系统已经驱逐属于用户的一些caching行。
正如你所看到的,程序依靠系统调用来驱逐数据caching中的许多用户数据行。 我怎样才能做到这一点?
我假定系统调用应该是文件相关或stream相关。
系统调用到系统调用对L1缓存的影响不尽相同。 一种方法是循环执行几个不同的系统调用,并测量每个系统调用的影响(包括例如与write()
相关的I / O相关调用,您可以在其中调整缓冲区大小,从而影响缓存)。
您可能希望避免将系统调用实现为vsyscalls (例如gettimeofday()
),因为它们不需要切换到内核空间。 参见[ 1,2 ]。
这听起来像你想要隔离L1d上的效果,所以你可能需要小心的另一件事:在第二步中,在通过阵列循环后,L1i缓存将被填充。 系统调用完成后,L1d 和 L1i可能都被污染了,所以你也可能会看到i-cache未命中的性能影响。
为了获得更好的细粒度测量,您可以使用硬件性能计数器,具体取决于您的体系结构。