使用VS2012/VTune进行缓存分析
Cache profiling with VS2012/VTune
我用以下代码进行测试:
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在一次运行中执行了多少个循环?
我建议从固定一些迭代开始,这些迭代运行的时间大约是您愿意等待的时间。这样你所有的运行都是一致的。
这可能是你的随机探测运行做更少的迭代,因为他们错过缓存更频繁。事实上,考虑到您似乎是基于时间停止基准测试,并且您的示例的瓶颈是缓存丢失,您可能会在类似数量的缓存丢失后停止运行,并且没有意识到好的订单正在进行更多的迭代。
相关文章:
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何使缓存线程安全
- 存储指令是否会阻止缓存未命中的后续指令?
- 缓存局部性与函数调用
- Qt 网页程序集缓存
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- std::shared_ptr vs std::make_shared:意外的缓存未命中和分支预测
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- 无法链接 LRU 缓存C++
- 空函数的参数是否加载到缓存中?
- 是否可以检查变量是否位于 L1/L2/L3 缓存中
- dynamic_cast每次调用是否比具有空检查的缓存变量更昂贵?
- C++:如何在从给定缓存中排除数字的同时生成随机数
- 如何对0,1,..中的k个随机数进行采样..,n-1,而不缓存到数组
- 如何重置VisualStudio(VS2010,VS2012)调试器缓存
- 使用VS2012/VTune进行缓存分析