[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