【发布时间】:2014-07-24 08:47:26
【问题描述】:
我正在使用以下代码进行测试:
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 计数器:
- \Cache\Copy 读取命中 %
- \Cache\Copy Read/sec
- \Memory\Page Faults/sec
性能会话后的结果如下: http://pastebin.com/L78Pjs9W
有人可以解释为什么它仍然会出现页面错误吗? 我还运行了相同的程序,将 i 和 j 颠倒过来尝试滥用缓存。 由于我意识到我的 CPU 可能会检测到跨步访问,因此我也尝试了随机访问,但这些 windows 计数器的结果仍然没有太大变化。
我也在 VTune Amplifier 中尝试过这个,得到了类似的奇怪结果。 随机访问或翻转 i 和 j 可以减少缓存未命中,使用以下内容: 测试[i][j] = 20; not 是否给我 0 cachemiss(或关闭) 我正在使用以下计数器:
- L2_RQSTS_MISS
- L2_RQSTS_REFERENCES
所有 3 种方法都给了我大约 7,000,000 次引用和 3,800,000 次未命中。在 25 秒的样本上。 我预计 [i][j] 访问几乎不会丢失,因为它具有空间局部性并且是可预测的。
我是否使用了正确的计数器,有什么提示吗?
【问题讨论】:
-
您是否禁用了优化?优化器可能会切换循环以优化缓存访问。
-
是的,它是在完整的调试版本中捕获的(没有优化)我还提到我使用了随机访问(因为没有优化,CPU 可以为我正确检测跨步访问和缓存)
-
初始化int test[num][num]={1}结果是否一样?
-
@dvasanth 这没有任何帮助:)