2

当我被卡住时,我正在练习缓存练习,我开始想知道一元增量 ++ 和 +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)在 RAM 中的 address 处分配0xA0000000,而第一个缓存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

假设我们正在访问像素(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 个代码存在差异。

干杯,

马可

编辑:这不是指任何特定的编译器。我想知道这是如何工作的。(练习在纸上)

4

1 回答 1

3

如果我们假设img.getVal(x,y)每次都返回相同的值,那么这两个代码片段应该是相同的。当然,在不知道具体是如何img.getVal(x,y)实现的情况下,我们不能说。

至于这行代码产生多少命中和未命中,将完全取决于代码入口处的缓存状态,以及代码是否被中断等等。但是可以假设,如果这一行单独运行,缓存为空且没有中断,它是一次未命中(对于读取操作)和一次命中(对于更新值的写回)。但这并没有考虑到wnateverimg.getVal(x,y)所做的——我不知道,因为您没有显示该代码。

于 2013-07-16T16:28:25.620 回答