L1高速缓存未命中的成本是多少?
编辑:出于参考目的(如果有人偶然发现此问题),Igor Ostrovsky写了一篇有关缓存未命中的好文章。它讨论了几个不同的问题并显示了示例编号。 结束编辑 我做了一些测试,<long story goes here>并且想知道性能差异是否是由于内存缓存未命中引起的。以下代码演示了该问题,并将其归结为关键的计时部分。以下代码具有几个循环,这些循环以随机顺序访问内存,然后以地址升序访问。 我在XP机器(与VS2005编译:cl / O2)和Linux机器(gcc –Os)上运行了它。两者产生相似的时间。这些时间以毫秒为单位。我相信所有循环都在运行,并且没有进行优化(否则它将“立即”运行)。 ***测试20000个节点 总订购时间:888.822899 总随机时间:2155.846268 这些数字有意义吗?差异主要是由于L1高速缓存未命中还是其他原因造成的?有20,000 ^ 2个内存访问,如果每个访问都是缓存未命中,则每个未命中大约3.2纳秒。我测试过的XP(P4)机器为3.2GHz,我怀疑(但不知道)具有32KB L1高速缓存和512KB L2。假设有20,000个条目(80KB),我认为不会有大量的L2丢失。原来如此(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss。在我看来,这太高了。也许不是,或者我的数学不好。我尝试使用VTune测量高速缓存未命中,但是出现了BSOD。现在,我无法连接到许可证服务器(grrrr)。 typedef struct stItem { long lData; //char acPad[20]; } LIST_NODE; #if defined( WIN32 ) void StartTimer( LONGLONG *pt1 ) { QueryPerformanceCounter( (LARGE_INTEGER*)pt1 ); } …