[LLVMdev] LLVM IR atomics: difference between unordered and monotonic? (original) (raw)

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