[LLVMdev] LLVM IR atomics: difference between unordered and monotonic?
Jeffrey Yasskin
jyasskin at googlers.com
Fri Jul 13 12:22:12 PDT 2012
On Fri, Jul 13, 2012 at 11:48 AM, Lei Zhao <leizhao833 at gmail.com> wrote:
> Hi All,
>
> I am reading about LLVM IR atomics (http://llvm.org/docs/Atomics.html) and
> get confused about the difference between "Unordered" and "Monotonic". In
> particular, I am not sure I understand the statement of "It essentially
> guarantees that if you take all the operations affecting a specific address,
> a consistent ordering exists.". For me, it means that for the following
> example, if {r1,r2} = {1,2}, {r3,r4} = {2,1} is not allowed under
> "Monotonic" but allowed under "Unordered". Is this all how "Monotonic" is
> stronger than "Unordered"? If not, can anyone provide an example where other
> behaviors are allowed under "Unordered" but not "Monotonic"?
>
>
> ----------------------------------------------------------------------------------------
> T1 T2 T3 T4
> W(X)=1 W(X)=2 r1=R(X) r3=R(X)
> r2=R(X) r4=R(X)
>
> * Legend: four threads run in parallel; W(X)/R(X) meaning atomic write/read
> of X.
> ----------------------------------------------------------------------------------------
Another litmus test is that with "unordered" variables, it's permissible to run:
T1 T2
W(X)=1 r1=R(X)
r2=R(X)
r3=R(X)
With X initially 0, and see r1==r3==0, but r2==1. Consider optimizing
code where &X == x == y, and the code was actually "r1=*x; r2=*y;
r3=*x;". Monotonic rules this out.
Jeffrey
More information about the llvm-dev
mailing list