使用VS2012/VTune进行缓存分析

Cache profiling with VS2012/VTune

本文关键字:缓存 VS2012 VTune 使用      更新时间:2023-10-16

我用以下代码进行测试:

const int num = 5000;
int test[num][num];
int _tmain(int argc, _TCHAR* argv[])
{
    while(true)
    {
        for (int i = 0; i < num; i++)
        {
            for (int j = 0; j < num; j++)
            {
                test[j][i] = 10;
            }
        }
    }
}

我有以下Windows计数器:

  • CacheCopy Read Hits %
  • CacheCopy Read/sec
  • 内存页面错误/秒

在一个性能会话之后,结果如下:http://pastebin.com/L78Pjs9W

谁能解释一下为什么它仍然有页面错误?此外,我还运行了相同的程序,I和j颠倒,试图滥用缓存。由于我意识到我的CPU可能会检测到跨行访问,我也尝试了随机访问,但这些窗口计数器的结果仍然没有太大变化。

我也尝试了这个在VTune放大器,给我类似的,奇怪的结果。随机访问或翻转i和j给了我更少的缓存丢失,使用以下方法:试验[i][j] = 20;给我0缓存(或关闭)我正在使用以下计数器:

  • L2_RQSTS_MISS
  • L2_RQSTS_REFERENCES

所有3个方法都给了我大约7,000,000个引用和3,800,000个遗漏。在25秒样品上。我期望[I][j]访问几乎不会出错,因为它具有空间局部性并且是可预测的。

我使用的计数器正确吗,有什么建议吗?

您有一个包含25,000,000个元素的数组,即100M。您没有说明二级缓存的大小,但它可能在几兆的数量级上,所以为什么您会期望接近0的缓存丢失呢?你的数据将不适合你的缓存,所以你将需要交换数据在一个出(也有缓存丢失)。

你的outer while在一次运行中执行了多少个循环?

我建议从固定一些迭代开始,这些迭代运行的时间大约是您愿意等待的时间。这样你所有的运行都是一致的。

这可能是你的随机探测运行做更少的迭代,因为他们错过缓存更频繁。事实上,考虑到您似乎是基于时间停止基准测试,并且您的示例的瓶颈是缓存丢失,您可能会在类似数量的缓存丢失后停止运行,并且没有意识到好的订单正在进行更多的迭代。