Re: How do relaxed access modes like opaque/acquire/release fit into the happens-before order.
Alex Otenko via Concurrency-interest <[email protected]> Fri, 13 Aug 2021 06:25:40 +0100
| Newsgroups | gmane.comp.java.jsr.166-concurrency |
|---|---|
| Message-ID | <CANkgWKja4bW9re0PVFXUstivsu6dkNi0LmuXxpUYmkEnDNkBcg@mail.gmail.com> |
--===============0633839133676993129== Content-Type: multipart/alternative; boundary="000000000000c47ef905c96a15fd" --000000000000c47ef905c96a15fd Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Yes, you are right, it's more nuanced. I didn't use this intuition in earnest. Alex On Fri, 13 Aug 2021, 05:02 Peter Veentjer, <[email protected]> wrote: > @Alex Otenko <[email protected]> > > I think there is a problem with the approach. > > The SO is a total order over all synchronization actions that is > consistent with PO. So it shouldn't happen that e.g. in the PO you have > A->B and in the SO you have B->A. > > Let's assume the following program: > > CPU1: > A=3D1 > B=3D1 > > And these to writes are opaque writes, than in the PO A->B, but in the > synchronization order A is not ordered before B because opaque creates a > total order over the loads/stores if a single address (coherence), but wi= ll > not order loads/stores of different addresses. So if opaque would be part > of the SO, it could violate the SO being consistent with PO. > > > > On Thu, Aug 12, 2021 at 11:43 AM Shuyang Liu <[email protected]> wrote: > >> Our group had a paper in 2019 formalizing the access modes in Java: >> https://dl.acm.org/doi/10.1145/3360568 >> (Note that there was a small problem on the semantics of volatile. In >> particular, one should use either leading or trailing fence insertion >> scheme consistently for volatile reads and writes, instead of mixing the= m. >> We have fixed it but still in the process of publishing it) >> >> In our model, we did not use the happens-before approach anymore. Instea= d >> we formalized it in terms of visibility order. (Details can be found in = the >> paper). >> >> In general, opaque mode accesses do not preserve program orders for >> accesses to different locations. They do, however, follows the coherence >> rules. The release-acquire mode accesses preserves program orders but no= t >> necessarily global orders. This has to do with the non-MCA nature of the >> Power architecture that it compiles to. You might find it strange that >> there is no sw order for release-acquire mode in our model. This is beca= use >> we simplified the cumulative effect of lwsync and hwsync using rf while = not >> considering fr (we have proved the compilation is correct in our on-goin= g >> paper) and x86 and ARMv8 are MCA. Finally, there is a total order among >> volatile accesses when they carry out =E2=80=9Cpush=E2=80=9D orders emul= ating the effect of >> full fences. >> >> The formal definition of data race is defined in terms of sw order >> though: a pair of accesses is said to form a race if they are 1) >> conflicting, and 2) not ordered by happens-before. We use the convention= al >> definition for happens before, which is (po | sw)+ (the transitive closu= re >> of the union of program order and synchronizes-with), where sw is define= d >> as the reads-from order from a release write to an acquire read. >> >> One last thing, in our formal model, opaque reads preserves the local >> program order. But this is purely a work-around to prevent out-of-thin-a= ir >> results. As a consequence, this requires the compiler to yield a =E2=80= =9Cfake=E2=80=9D >> dependency after each read instruction, which is not true in practice. >> >> Hope this helps! >> >> Best Regards, >> Shuyang >> >> On Aug 12, 2021, at 1:18 AM, Peter Veentjer via Concurrency-interest < >> [email protected]> wrote: >> >> =EF=BB=BF >> Hi Alex, >> >> Thanks for your answer. That sounds like a very sensible approach. >> >> I need to think about this. >> >> Regards, >> >> Peter. >> >> On Thu, Aug 12, 2021 at 11:14 AM Alex Otenko <[email protected]= > >> wrote: >> >>> I treat opaque read/write as part of SO, but which do not introduce SW >>> edges - no transitive closure of program orders. They observe each othe= r, >>> because SO specifies who is before who. >>> >>> Then acquire/ release introduce corresponding parts of transitive >>> closure. In the end volatile load/store are just that. >>> >>> Alex >>> >>> On Thu, 12 Aug 2021, 08:52 Peter Veentjer via Concurrency-interest, < >>> [email protected]> wrote: >>> >>>> The happens-before (HB) order is defined using: >>>> >>>> Synchronization order (SO): total order over all synchronization >>>> actions. >>>> >>>> Synchronizes with order (SW): a sub order of the SO that only orders >>>> e.g. a volatile write of X with all subsequent volatile reads of X. >>>> >>>> Program Order (PO): a partial order that orders all memory actions >>>> issued by a single CPU. >>>> >>>> And the HB relation is defined as the transitive closure of the union >>>> of the SW and PO. >>>> >>>> My question is how do relaxed access modes like opaque and >>>> acquire/release fit into the HB? >>>> >>>> Let's start with opaque; is an opaque write/read part of the SO? If so= , >>>> then it will be part of the SW and HB. And because of this, it will or= der >>>> loads/stores to different addresses which is not desirable. So I guess= the >>>> logical solution would be that an opaque read/write is not part of the= SO >>>> and hence we don't get this problem. However now we have the problem = that >>>> an opaque read/write is not ordered by the HB and we have a data race = (read >>>> will still be hb-consistent). >>>> >>>> I'm running into a similar problem with the acquire/release. >>>> Traditionally they are called synchronization actions since a release-= store >>>> will prevent any older load/store to be reordered with the release-sto= re >>>> and acquire-load will prevent any later load/store to be reordered wit= h the >>>> acquire-load. So they provide some level of 'synchronization'; but is= this >>>> sufficient for them to be part of the SO order? Or are they excluded f= rom >>>> the SO and we end up with a data-race? >>>> >>>> Or could it be that the happens-before model isn't a suitable model to >>>> deal with relaxed access modes? >>>> >>>> Regards, >>>> >>>> Peter. >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Concurrency-interest mailing list >>>> [email protected] >>>> http://cs.oswego.edu/mailman/listinfo/concurrency-interest >>>> >>> _______________________________________________ >> Concurrency-interest mailing list >> [email protected] >> http://cs.oswego.edu/mailman/listinfo/concurrency-interest >> >> --000000000000c47ef905c96a15fd Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"auto">Yes, you are right, it's more nuanced. I didn't u= se this intuition in earnest.<div dir=3D"auto"><br></div><div dir=3D"auto">= Alex</div></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gm= ail_attr">On Fri, 13 Aug 2021, 05:02 Peter Veentjer, <<a href=3D"mailto:= [email protected]">[email protected]</a>> wrote:<br></div><block= quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc= solid;padding-left:1ex"><div dir=3D"ltr"><a class=3D"gmail_plusreply" id= =3D"m_48113149820028421plusReplyChip-0" href=3D"mailto:oleksandr.otenko@gma= il.com" target=3D"_blank" rel=3D"noreferrer">@Alex Otenko</a><div><br></div= ><div> I think there is a problem with the approach.</div><div><br></div><d= iv>The SO is a total order over all synchronization actions that is consist= ent with PO. So it shouldn't happen that e.g. in the PO you have A->= B and in the SO you have B->A.<br><br></div><div>Let's assume the fo= llowing program:<br><br></div><div>CPU1:<br></div><div>=C2=A0=C2=A0=C2=A0 A= =3D1<br></div><div>=C2=A0=C2=A0=C2=A0 B=3D1<br><br></div><div>And these to = writes are opaque writes, than in the PO A->B, but in the synchronizatio= n order A is not ordered before B because opaque creates a total order over= the loads/stores if a single address (coherence), but will not order loads= /stores of different addresses. So if opaque would be part of the SO, it co= uld violate the SO being consistent with PO.<br><br><br></div></div><br><di= v class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Thu, Aug 1= 2, 2021 at 11:43 AM Shuyang Liu <<a href=3D"mailto:[email protected]" t= arget=3D"_blank" rel=3D"noreferrer">[email protected]</a>> wrote:<br></= div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor= der-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"auto"><di= v dir=3D"ltr">Our group had a paper in 2019 formalizing the access modes in= Java:=C2=A0<a href=3D"https://dl.acm.org/doi/10.1145/3360568" target=3D"_b= lank" rel=3D"noreferrer">https://dl.acm.org/doi/10.1145/3360568</a><div>(No= te that there was a small problem on the semantics of volatile. In particul= ar, one should use either leading or trailing fence insertion scheme consis= tently for volatile reads and writes, instead of mixing them. We have fixed= it but still in the process of publishing it)=C2=A0</div><div><br></div><d= iv>In our model, we did not use the happens-before approach anymore. Instea= d we formalized it in terms of visibility order. (Details can be found in t= he paper).</div><div><br></div><div>In general, opaque mode accesses do not= preserve program orders for accesses to different locations. They do, howe= ver, follows the coherence rules. The release-acquire mode accesses preserv= es program orders but not necessarily global orders. This has to do with th= e non-MCA nature of the Power architecture that it compiles to. You might f= ind it strange that there is no sw order for release-acquire mode in our mo= del. This is because we simplified the cumulative effect of lwsync and hwsy= nc using rf while not considering fr (we have proved the compilation is cor= rect in our on-going paper) and x86 and ARMv8 are MCA. Finally, there is a = total order among volatile accesses when they carry out =E2=80=9Cpush=E2=80= =9D orders emulating the effect of full fences.=C2=A0</div><div><br></div><= div>The formal definition of data race is defined in terms of sw order thou= gh: a pair of accesses is said to form a race if they are 1) conflicting, a= nd 2) not ordered by happens-before. We use the conventional definition for= happens before, which is (po | sw)+ (the transitive closure of the union o= f program order and synchronizes-with), where sw is defined as the reads-fr= om order from a release write to an acquire read.=C2=A0</div><div><br></div= ><div>One last thing, in our formal model, opaque reads preserves the local= program order. But this is purely a work-around to prevent out-of-thin-air= results. As a consequence, this requires the compiler to yield a =E2=80=9C= fake=E2=80=9D dependency after each read instruction, which is not true in = practice.=C2=A0</div><div><br></div><div>Hope this helps!</div><div><br><di= v dir=3D"ltr">Best Regards,<br><div>Shuyang</div></div></div></div><div dir= =3D"ltr"><br><blockquote type=3D"cite">On Aug 12, 2021, at 1:18 AM, Peter V= eentjer via Concurrency-interest <<a href=3D"mailto:concurrency-interest= @cs.oswego.edu" target=3D"_blank" rel=3D"noreferrer">concurrency-interest@c= s.oswego.edu</a>> wrote:<br><br></blockquote></div><blockquote type=3D"c= ite"><div dir=3D"ltr">=EF=BB=BF<div dir=3D"ltr"><div>Hi Alex,</div><div><br= ></div><div>Thanks for your answer. That sounds like a very sensible approa= ch. <br><br></div><div>I need to think about this.<br><br></div><div>Regard= s,<br><br></div><div>Peter.<br></div></div><br><div class=3D"gmail_quote"><= div dir=3D"ltr" class=3D"gmail_attr">On Thu, Aug 12, 2021 at 11:14 AM Alex = Otenko <<a href=3D"mailto:[email protected]" target=3D"_blank" = rel=3D"noreferrer">[email protected]</a>> wrote:<br></div><bloc= kquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:= 1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"auto">I treat opaq= ue read/write as part of SO, but which do not introduce SW edges - no trans= itive closure of program orders. They observe each other, because SO specif= ies who is before who.<div dir=3D"auto"><br></div><div dir=3D"auto">Then ac= quire/ release introduce corresponding parts of transitive closure. In the = end volatile load/store are just that.<br><div dir=3D"auto"><br></div><div = dir=3D"auto">Alex</div></div></div><br><div class=3D"gmail_quote"><div dir= =3D"ltr" class=3D"gmail_attr">On Thu, 12 Aug 2021, 08:52 Peter Veentjer via= Concurrency-interest, <<a href=3D"mailto:[email protected]= .edu" target=3D"_blank" rel=3D"noreferrer">[email protected]= du</a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margi= n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex= "><div dir=3D"ltr"><div><div><div><div><div><div><div><div><div><div>The ha= ppens-before (HB) order is defined using:<br><br></div>Synchronization orde= r (SO): total order over all synchronization actions.<br><br></div>Synchron= izes with order (SW): a sub order of the SO that only orders e.g. a volatil= e write of X with all subsequent volatile reads of X.<br><br></div>Program = Order (PO): a partial order that=C2=A0 orders all memory actions issued by = a single CPU.<br><br></div>And the HB relation is defined as the transitive= closure of the union of the SW and PO.<br><br></div>My question is how do = relaxed access modes like opaque and acquire/release fit into the HB?<br><b= r></div>Let's start with opaque; is an opaque write/read part of the SO= ? If so, then it will be part of the SW and HB. And because of this, it wil= l order loads/stores to different addresses which is not desirable. So I gu= ess the logical solution would be that an opaque read/write is not part of = the SO and hence we don't get this problem.=C2=A0 However now we have t= he problem that an opaque read/write is not ordered by the HB and we have a= data race (read will still be hb-consistent).<br></div><br></div>I'm r= unning into a similar problem with the acquire/release. Traditionally they = are called synchronization actions since a release-store will prevent any o= lder load/store to be reordered with the release-store and acquire-load wil= l prevent any later load/store to be reordered with the acquire-load. So th= ey provide some level of=C2=A0 'synchronization'; but is this suffi= cient for them to be part of the SO order? Or are they excluded from the SO= and we end up with a data-race?</div><div><br></div><div>Or could it be th= at the happens-before model isn't a suitable model to deal with relaxed= access modes?<br></div><div><br></div>Regards,<br><br></div>Peter.<br><div= ><div><br><br><div><div><div><br><br></div></div></div></div></div></div> _______________________________________________<br> Concurrency-interest mailing list<br> <a href=3D"mailto:[email protected]" rel=3D"noreferrer nor= eferrer" target=3D"_blank">[email protected]</a><br> <a href=3D"http://cs.oswego.edu/mailman/listinfo/concurrency-interest" rel= =3D"noreferrer noreferrer noreferrer" target=3D"_blank">http://cs.oswego.ed= u/mailman/listinfo/concurrency-interest</a><br> </blockquote></div> </blockquote></div> <span>_______________________________________________</span><br><span>Concu= rrency-interest mailing list</span><br><span><a href=3D"mailto:Concurrency-= [email protected]" target=3D"_blank" rel=3D"noreferrer">Concurrency-in= [email protected]</a></span><br><span><a href=3D"http://cs.oswego.edu/ma= ilman/listinfo/concurrency-interest" target=3D"_blank" rel=3D"noreferrer">h= ttp://cs.oswego.edu/mailman/listinfo/concurrency-interest</a></span><br></d= iv></blockquote></div></blockquote></div> </blockquote></div> --000000000000c47ef905c96a15fd-- --===============0633839133676993129== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Concurrency-interest mailing list [email protected] http://cs.oswego.edu/mailman/listinfo/concurrency-interest --===============0633839133676993129==--