By following the given commands above, I would assume that X and Y would be as follows:
X = 1 (Proc 0)
X = 10 (Proc 1)
X = 25 (Proc 1)
Proc 0 loads X as 1
Proc 1 loads X as 25
Y = 100 (Proc 1)
Proc 1 loads X as 25
However, since X is a shared variable does the value of it change among processors?
This comment was marked helpful 0 times.
kayvonf
@mitraraman: Let me try and clear up your confusion. Here, X and Y refer addresses. Both Proc 0 and Proc 1 perform loads and stores to these addresses. As discussed in the demo in class, the coherence protocol will result in the following behavior:
(Assume the original values at address X and address Y are 0. Also, below I'll use X loosely to mean the line containing X. Ditto for Y.)
P0 load X:
P0 triggers BusRd for X
P0 loads X (value=0) into S state
P0 receives data (value=0) from its cache
P1 load X:
P1 triggers BusRd for X
P1 loads X (value=0) into S state
P1 receives data (value=0) from its cache
P0 store 1 to X:
P0 triggers BusRdX for X
P1 invalidates X
P0 loads X (value=0) to M state
P0 writes 1 to X
P1 store 10 to X:
P1 triggers BusRdX for X
P0 flushes X, memory now contains value 1 at address X
P0 invalidates X
P1 loads X (value=1) into M state
P1 writes 10 to X
P1 store 25 to X:
P1 writes 25 to X
P0 load X:
P0 triggers BusRd for X
P1 flushes X, memory now contains value 25 at address X
P1 transitions X to S state
P0 loads X (value=25) into S state
P0 receives data (value=25) from its cache
P1 load X:
P1 receives data (value=25) from its cache
P1 store 100 to Y:
P1 triggers BusRdX for Y
P1 loads Y (value=0) into M state
P1 writes 100 to Y
P0 load Y:
P0 triggers BusRd for Y
P1 flushes Y, memory now contains value 100 at address Y
P1 transitions Y to S state
P0 loads Y (value=100) into S state
P0 receives data (value=100) from its cache
This comment was marked helpful 0 times.
raphaelk
When P1 loads X at the end, I am guessing P1 was at modified state because it just stored 100 to Y cache line. Then, how does P1 go back to Shared state (sharing X=25) from modified state, cache holding Y=100? Does it hear BusRdx somewhere to go to Invalid state and read X?
This comment was marked helpful 0 times.
kayvonf
@raphaelk: X and Y are assumed to be on different cache lines. (or you can just think of X and Y as cache lines, not addresses)
This comment was marked helpful 0 times.
markwongsk
I am confused regarding the last line of the slide:
Proc 1: Load X
but the explanation given by @kayvonf seems to indicate that the last instruction should be
Proc 0: Load Y
I'm pretty sure that the intended instruction should be Proc 0: Load Y as that makes more pedagogical sense. However, if the instruction was Proc 1: Load X, the following should be what would happen:
P1 load X:
P1 receives data (value=25) from its cache
as P1 was already in the M state for the address X.
This comment was marked helpful 0 times.
Xelblade
@markwongsk I believe you are correct; it was noticed in class but the slide hasn't been corrected yet.
By following the given commands above, I would assume that X and Y would be as follows:
X = 1 (Proc 0)
X = 10 (Proc 1)
X = 25 (Proc 1)
Proc 0 loads X as 1
Proc 1 loads X as 25
Y = 100 (Proc 1)
Proc 1 loads X as 25
However, since X is a shared variable does the value of it change among processors?
This comment was marked helpful 0 times.
@mitraraman: Let me try and clear up your confusion. Here,
X
andY
refer addresses. Both Proc 0 and Proc 1 perform loads and stores to these addresses. As discussed in the demo in class, the coherence protocol will result in the following behavior:(Assume the original values at address
X
and addressY
are 0. Also, below I'll useX
loosely to mean the line containingX
. Ditto forY
.)P0 load X:
P0 triggers BusRd for
X
P0 loads
X
(value=0) into S stateP0 receives data (value=0) from its cache
P1 load X:
P1 triggers BusRd for
X
P1 loads
X
(value=0) into S stateP1 receives data (value=0) from its cache
P0 store 1 to X:
P0 triggers BusRdX for
X
P1 invalidates
X
P0 loads
X
(value=0) to M stateP0 writes 1 to
X
P1 store 10 to X:
P1 triggers BusRdX for
X
P0 flushes
X
, memory now contains value 1 at addressX
P0 invalidates
X
P1 loads
X
(value=1) into M stateP1 writes 10 to
X
P1 store 25 to X:
P1 writes 25 to
X
P0 load X:
P0 triggers BusRd for
X
P1 flushes
X
, memory now contains value 25 at addressX
P1 transitions
X
to S stateP0 loads
X
(value=25) into S stateP0 receives data (value=25) from its cache
P1 load X:
P1 receives data (value=25) from its cache
P1 store 100 to Y:
P1 triggers BusRdX for
Y
P1 loads
Y
(value=0) into M stateP1 writes 100 to
Y
P0 load Y:
P0 triggers BusRd for
Y
P1 flushes
Y
, memory now contains value 100 at addressY
P1 transitions
Y
to S stateP0 loads
Y
(value=100) into S stateP0 receives data (value=100) from its cache
This comment was marked helpful 0 times.
When P1 loads X at the end, I am guessing P1 was at modified state because it just stored 100 to Y cache line. Then, how does P1 go back to Shared state (sharing X=25) from modified state, cache holding Y=100? Does it hear BusRdx somewhere to go to Invalid state and read X?
This comment was marked helpful 0 times.
@raphaelk: X and Y are assumed to be on different cache lines. (or you can just think of X and Y as cache lines, not addresses)
This comment was marked helpful 0 times.
I am confused regarding the last line of the slide:
Proc 1: Load X
but the explanation given by @kayvonf seems to indicate that the last instruction should be
Proc 0: Load Y
I'm pretty sure that the intended instruction should be Proc 0: Load Y as that makes more pedagogical sense. However, if the instruction was Proc 1: Load X, the following should be what would happen:
P1 load X: P1 receives data (value=25) from its cache
as P1 was already in the M state for the address X.
This comment was marked helpful 0 times.
@markwongsk I believe you are correct; it was noticed in class but the slide hasn't been corrected yet.
This comment was marked helpful 0 times.