当我被卡住时,我正在练习缓存练习,我开始想知道一元增量++和+1操作之间的差异。
我有这行代码(我们称之为 CODE1 ):
h[img.getVal(x,y)]++;
这与以下编码相同吗?(我们称之为 CODE2 )
h[img.getVal(x,y)]=h[img.getVal(x,y)]+1;
很明显它们是相同的,谈到宏观效应(它们都增加1 h[img.getVal(x,y)]
),但它们真的是一样吗?
我想知道这是因为缓存。
假设我们有一个直接映射缓存,第一个pixel(0,0)
在地址0xA0000000
的RAM中分配,而第h[0]
位于0xB0000000
。
假设有6位偏移,10位索引和16位标记,我们就有这种情况:
0xA0000000
是:
--------TAG---------|---INDEX----|-OFFSET
1010 0000 0000 0000 |0000 0000 00|00 0000
以及二进制文件中的0xB0000000
是:
--------TAG---------|---INDEX----|-OFFSET
1011 0000 0000 0000 |0000 0000 00|00 0000
使用2个代码有多少次失误和命中( AND WHY ),假设我们正在访问像素(0,0),因此x = 0,y = 0,并且该像素(0,0)的值为0 (它是黑色,这是灰度图像)?使用这两个不同的代码是否存在差异?
我想说至少有2次未命中,因为在这两种情况下,首先程序必须执行img.getVal(x,y)
,这会导致未命中,填充缓存中的一行并将值0返回给CPU,然后h[img.getVal(x,y)]
也返回一个未命中,因为缓存不包含任何与h数组相关的信息。
但那么,会发生什么?
我们现在缓存h[0]
的值,我们需要增加它。我认为使用上面的2个代码存在差异。
干杯,
马
编辑:这不是指任何特定的编译器。我想知道这是如何工作的。 (演习在纸上)
答案 0 :(得分:3)
如果我们假设img.getVal(x,y)
每次返回相同的值,则两个代码段应该相同。当然,如果不确切知道img.getVal(x,y)
的实施方式,我们就不能说了。
关于这行代码生成的命中和未命中数将完全取决于代码入口处缓存的状态,以及代码是否被中断等等。但是人们会认为,如果该行是隔离运行的,具有空缓存且没有中断,那么它是一个未命中(对于读操作)和一个命中(对于更新值的写回)。但是这并没有考虑到wnatever img.getVal(x,y)
- 我不知道,因为你没有显示该代码。