[jmm-dev] State of play with modeling relaxed memory
Alan Jeffrey
ajeffrey at bell-labs.com
Mon Mar 17 14:59:29 UTC 2014
The way I can imagine rescuing the Mazurkeiwicz trace semantics is by
introducing something like constraint actions (C x:V) which constrains x
to only have values from V. The semantics of read would then be:
sum_V (C x:V) . sum_(v in V) (R x=v) . P
The requirements for a valid execution would then include that for any
constraint action (C x:V) and any visible write action (W x=w), we have
w in V. Such a model should support TC1 since the semantics of thread 1
would be:
sum_V (C x:V) . Q_V
where:
Q_V = sum(v in V) (R x=v) . P_v
P_+n = (W y=1)
P_-n = 0
In particular:
Q_{0,1}
= sum(v in {0,1}) (R x=v) . P_v
= sum(v in {0,1}) (R x=v) . (W y=1)
= (W y=1) . sum(v in {0,1}) (R x=v)
which allows the write action to move before the read, and the rest is
routine.
James and I sketched out such a model, but abandoned it because it was
looking pretty cumbersome with its additional constraint actions. It
might be worth rescuing if the alternatives are looking just as
inelegant though.
A.
On 03/15/2014 01:23 PM, Doug Lea wrote:
> On 03/12/2014 10:19 AM, Alan Jeffrey wrote:
>> Ah yes, I owe the world a status report...
>>
>> I looked into modeling relaxed memory using Mazurkeiwicz traces, that
>> is strings
>> of actions up to appropriate reorderings. My main result here is
>> negative, in
>> that you can build a model of memory, and get it to support
>> speculative write,
>> in that:
>>
>> r=x; y=1 == y=1; r=x
>> if(b){y=1;}else{y=1;} == y=1
>>
>> The justification for speculative write is:
>>
>> sum_i a_i . b . P == b . sum_i a_i . P
>>
>> when b is independent of every a_i. The problem with this model is
>> that it only
>> supports a speculative write w when every branch performs w. In
>> particular, it
>> doesn't support causality test case 1:
>>
>> thread 1: r1 = x; if (r1 >= 0) { y = 1; }
>> thread 2: r2 = y; x = r2;
>>
>> The trace semantics of thread 1 is:
>>
>> P = sum_v (R x=v) . P_v
>>
>> where
>>
>> P_+n = (W y=1)
>> P_-n = 0
>>
>> Since some P_v doesn't perform (W y=1), P can't perform (W y=1) before
>> (R x=v).
>>
>> So, assuming that TC1 (and similar examples) still stands, I don't see
>> how to
>> get a Mazurkeiwicz trace model to fly.
>
> Where TC1 is from
> http://www.cs.umd.edu/~pugh/java/memoryModel/unifiedProposal/testcases.html
>
> The "human" rationale given for allowing r1 == r2 == 1 is that,
> via whole program analysis, a compiler could determine that
> x and y are always non-negative. Given this, TC1 acts as:
> thread 1: r1 = x; y = 1;
> thread 2: r2 = y; x = r2;
> which seems unchallenging.
>
> You'd think that any memory model that handled this sort of case
> would explicitly incorporate/allow the global analysis that led to
> its rationale. RAO does so. It's surprising that the JSR133
> model doesn't, but we don't think this generalizes completely.
>
> So, it is not clear to me that you've shown a fatal flaw in Mazurkeiwicz
> trace based mechanics per se.
>
> -Doug
>
More information about the jmm-dev
mailing list