[Haskell-cafe] Haskell memory model

Li-yao Xia lysxia at gmail.com
Mon Mar 5 12:17:52 UTC 2018

Thanks Ben! Your answer and links are very helpful. I'll study them 


On 03/05/2018 04:24 AM, Ben Lippmeier wrote:
>> On 5 Mar 2018, at 2:21 am, Li-yao Xia <lysxia at gmail.com 
>> <mailto:lysxia at gmail.com>> wrote:
>> What guarantees are there about shared memory concurrency in Haskell? 
>> In particular, I'm wondering how to correctly and efficiently 
>> synchronize mutable operations from the vector package, using stm or 
>> atomic-primops.
>> - Are reads/writes on vectors sequentially consistent? As a concrete 
>> example, can the following program (a common test for relaxed memory 
>> models) print anything?
> Read/Writes for single elements of a vector compile down to single 
> machine instructions, which will be some sort of vanilla MOV on x86. The 
> x86 architecture is free to reorder stores after writes. AIUI this is 
> due to the write buffer [2] which holds writes before they are committed 
> to main memory. The x86 instruction set has an MFENCE operation to force 
> loads and stores to be visible to global memory before others, but this 
> isn’t inserted for read/writes to mutable vectors.
> [1] https://en.wikipedia.org/wiki/Memory_ordering
> [2] https://en.wikipedia.org/wiki/Write_buffer
>> - Do atomic operations (via stm or atomic-primops) imply some 
>> constraints between vector operations?
> I think the answer to this is “probably, but only incidentally”. The 
> MFENCE instruction on x86 applies to all deferred load/store actions in 
> the physical thread. If you can cause an MFENCE to be emitted into the 
> instruction stream then this will also cause vector operations to be 
> sequentialised.
> See:
> https://stackoverflow.com/questions/21506748/reasoning-about-ioref-operation-reordering-in-concurrent-programs
> http://blog.ezyang.com/2014/01/so-you-want-to-add-a-new-concurrency-primitive-to-ghc/
> Ben.

More information about the Haskell-Cafe mailing list