增量挑战:++对+1

Increment challenge: ++ vs. +1

本文关键字:挑战      更新时间:2023-10-16

当我被卡住时,我正在缓存上练习,我开始怀疑一元增量++和+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

假设我们正在访问像素(0,0),因此x=0,y=0,并且该像素(0,0)的值为0(它是黑色的,这是灰度图像),那么使用这两个代码有多少次未命中和命中(以及为什么)?使用这两种不同的代码有区别吗?

我想说至少有两次未命中,因为在这两种情况下,首先程序必须执行img.getVal(x,y),这会导致未命中,填充缓存中的一行并将值0返回给CPU,然后是h[img.getVal(x,y)],这也会返回未命中,这是因为缓存中还不包含任何与h数组相关的信息。但是,接下来会发生什么呢?我们现在在缓存中有h[0]的值,我们需要增加它。我认为使用上面的两个代码有区别。

干杯,

Marco

编辑:这不是指任何特定的编译器。我想知道这是怎么回事。(练习在纸上)

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

至于这行代码生成的命中和未命中次数,将完全取决于代码入口的缓存状态,以及代码是否被中断等。但是,如果这行代码是孤立运行的,缓存为空,没有中断,那么它是一次未命中(用于读操作)和一次命中(用于写回更新值)。但这并没有考虑到img.getVal(x,y)的所有者——我不知道,因为您没有显示该代码。