Optimizations for mutable structures?

Simon Marlow simonmar at microsoft.com
Wed Dec 7 10:47:10 EST 2005


On 07 December 2005 15:21, Claus Reinke wrote:

>> (assuming 'acts' doesn't modify 'r').
> 
> this remark is the problem.
> 
>> No, Jan's transformation is correct even in a multithreaded setting.
>> It might eliminate some possible outcomes from a non-deterministic
>> program, but that's ok.  There's no requirement that all
>> interleavings according to the semantics have to be implemented. ..
> 
> not implementing traces promised as possible by the semantics is not
> a good idea, imho, as programmers have some control over the set of
> traces themselves.

It's unreasonable to expect an implementation to provide *all*
transitions specified by the semantics.  How could you tell, for one
thing?  For example, what if the compiler doesn't allow a context switch
between two adjacent operations:

    writeIORef r e
    x <- readIORef r 

this is a good example, in fact, because GHC will quite possibly compile
this code into a single basic block that doesn't allow a context switch
between the two statements.  However, the semantics certainly allows a
context switch between these two operations.  Is GHC wrong?  No way!  So
how do you specify which transitions an implementation must provide?
Perhaps there's a good formulation, but I don't know what it is.

> in this case, acts could implement the synchronisation with another
> thread working on r, ie., even if acts does not modify r itself, it
> might reliably cause another thread to modify r before acts can end.
> if such synchronisations depend on traces you have eliminated, the
> code 
> would just block (without apparent reason), whereas in this case, r
> will have a value after acts that shouldn't have been possible, due
> to the explicit synchronisation code (again, happy debugging) ..

I should have said that if 'acts' blocks, then the transformation is
invalid.  When I say "acts doesn't modify r", I mean to include all ways
of modifying r, including synchronising with another thread, or calling
an unknown function.

> of course, you could try to infer non-sequential interference with r
> resulting from act, but that is what Malcolm pointed out - you have
> to take the full semantics into account when doing such
> transformations (btw, java originally made a mess of this- hope that
> has been fixed by now). 

I don't think so.  Malcolm asserted that the transformation was invalid
in a multi-threaded implementation; I disagree - it's just as valid in a
multi-threaded implementation as a single-threaded one.  You don't have
to preserve non-deterministic interactions with other threads, because
they're non-deterministic!

Cheers,
	Simon


More information about the Glasgow-haskell-users mailing list