最近写了一个矩阵转置的程序。
for (int i = 0; i < 1000; i++)
{
for (int j = 0; j < 1000; j++)
{
ndata[j][i] = odata[i][j];
}
}
从上面的代码,我们知道内循环对odata
是缓存友好的,但是对ndata
不友好,这会导致很多cache miss
,我想在 read 指令
执行后检查 L1 cache
和 L2 cache
的值。我怎样才能做到这一点?
请您参考如下方法:
首先 - 1000*1000*2 个元素(什么,int?)不适合我所知道的任何 L1,也许是 L3。
至于你的问题 - 没有简单的方法来检查缓存的内容(期望在产生该信息的 CPU 或缓存模拟器上运行它),你可以测量该行的访问时间但是你会a) 影响缓存的内容或它们的 LRU 权重,并且 b) 可能会得到无意义的结果,除非您在一次测量中测量访问多个这样的行并摊销。
顺便说一句,如果您有兴趣改进此代码,只需在每次迭代时为 ndata[j+1][i]
添加 SW 预取。