On 12/17/2014 03:28 AM, David Holmes wrote:
On 17/12/2014 10:06 AM, Martin Buchholz wrote:
On Thu, Dec 11, 2014 at 1:08 AM, Andrew Haley <a...@redhat.com> wrote:
On 11/12/14 00:53, David Holmes wrote:
There are many good uses of storestore in the various lock-free
algorithms inside hotspot.
There may be many uses, but I am extremely suspicious of how good
they are. I wonder if we went through all the uses of storestore in
hotspot how many bugs we'd find. As far as I can see (in the absence
of other barriers) the only things you can write before a storestore
are constants.
Hans has provided us with the canonical writeup opposing store-store
and load-load barriers, here:
http://www.hboehm.info/c++mm/no_write_fences.html
Few programmers will be able to deal confidently with causality
defying time paradoxes, especially loads from "the future".
Well I take that with a grain of salt - Hans dismisses ordering based
on dependencies which puts us into the realm of those "causality
defying time paradoxes" in my opinion. Given:
x.a = 0;
x.a++
storestore
x_init = true
Hans allows for the nonsensical, in my view, possibility that the load
of x.a can happen after the x_init=true store and yet somehow be
subject to the ++ and the ensuing store that has to come before the
x_init = true.
David
-----
Perhaps, he is speaking about why it is dangerous to replace BOTH
release with just store-store AND acquire with just load-load?
The example would then become:
T1:
store x.a <- 0
load r <- x.a
store x.a <- r+1
; store-store
store x_init <- true
T2:
load r <- x.a
; load-load
if (r)
store x.a <- 42
Suppose a "store" on some hypothetical architecture is actually a
two-phase execution: prepare-store, commit-store
With prepare-store imagined as speculative posting of store to the write
buffer and commit-store just marking it in the write buffer as commited,
so that is is written to main memory on write buffer flush. Non commited
stores are not written to main memory, but are allowed to be visible to
loads in some threads (executing on same core?) which are not ordered by
load-store before the speculative prepare-store. A load-load does not
prevent the T2 to be executed as following:
T2:
prepare-store x.a <- 42
load r <- x.a
; load-load
if (r)
commit-store x.a <- 42
Now this speculative prepare-store can (in real time) happen long before
T1 instructions are executed. The loads in T1 are then allowed to "see"
this speculative prepare-store from T2, because just store-store does
not logically order them in any way - only load-store would.
Does this make sense?
Regards, Peter