memory ordering

Carter Schonwald carter.schonwald at gmail.com
Fri Dec 20 17:05:19 UTC 2013


Hey John, so you're wanting atomic reads and writes?

I'm pretty sure that you want to use atomic memory operations for this.  I
believe Ryan Newton has some tooling you can use right now for that.


On Fri, Dec 20, 2013 at 3:57 AM, Christian Höner zu Siederdissen <
choener at tbi.univie.ac.at> wrote:

> Hi John,
>
> I guess you probably want to "pseq x". See below for an example. Since
> your 2nd
> action does not depend on your 1st.
>
> Gruss,
> Christian
>
>
> import Debug.Trace
> import GHC.Conc
>
> main = do
>   x <- return (traceShow "1" $ 1::Int)
>   -- x `pseq` print (2::Int)
>   print (2::Int)
>   print x
>
>
> * John Lato <jwlato at gmail.com> [20.12.2013 02:36]:
> >    Hello,
> >
> >    I'm working on a lock-free algorithm that's meant to be used in a
> >    concurrent setting, and I've run into a possible issue.
> >
> >    The crux of the matter is that a particular function needs to perform
> the
> >    following:
> >
> >    > x <- MVector.read vec ix
> >    > position <- readIORef posRef
> >
> >    and the algorithm is only safe if these two reads are not reordered
> (both
> >    the vector and IORef are written to by other threads).
> >
> >    My concern is, according to standard Haskell semantics this should be
> >    safe, as IO sequencing should guarantee that the reads happen
> in-order.
> >    Of course this also relies upon the architecture's memory model, but
> x86
> >    also guarantees that reads happen in order.  However doubts remain; I
> do
> >    not have confidence that the code generator will handle this
> properly.  In
> >    particular, LLVM may freely re-order loads of NotAtomic and Unordered
> >    values.
> >
> >    The one hope I have is that ghc will preserve IO semantics through the
> >    entire pipeline.  This seems like it would be necessary for proper
> >    handling of exceptions, for example.  So, can anyone tell me if my
> worries
> >    are unfounded, or if there's any way to ensure the behavior I want?  I
> >    could change the readIORef to an atomicModifyIORef, which should
> issue an
> >    mfence, but that seems a bit heavy-handed as just a read fence would
> be
> >    sufficient (although even that seems more than necessary).
> >
> >    Thanks,
> >    John L.
>
> > _______________________________________________
> > Glasgow-haskell-users mailing list
> > Glasgow-haskell-users at haskell.org
> > http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>
>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20131220/fee5879b/attachment.html>


More information about the Glasgow-haskell-users mailing list