Best way to get to CAS/fetch-and-add on unboxed vectors?

Carter Schonwald carter.schonwald at gmail.com
Thu Nov 21 19:33:41 UTC 2013


nothing blocking adding the primops right now from a technical standpoint
(though it'd be too late for the 7.8 merge window).
The main blocker is i'm moving over the next month + I'm amidst sorting
transitioning from consulting to some other work. (life and all).

i want to also add the inline  primops to the native code gen  and -fvia-c
in tandem with baking in the LLVM support. Which will take a teeny bit of
extra work, but really very much worth it I think.

Glad you agree about the constructors being handy! Should make is possible
to have the CAS vector stuff working as a selfcontained experiment that
just works ™ with current vector.


On Thu, Nov 21, 2013 at 2:05 PM, Ryan Newton <rrnewton at gmail.com> wrote:

> I'm not sure why this would be a ticket, because it's not really a bug or
> an issue with GHC.  But I did go ahead and write up the state of affairs in
> a Haskell wiki page here:
>
>     http://www.haskell.org/haskellwiki/AtomicMemoryOps
>
> There's just a fundamental impedance mismatch between having a lazy/pure
> world where pointer equality is meaningless, and operations based on
> pointer-equality like CAS.  I think we've papered over that as best we
> could with the "Ticketed" interface describe in that wiki, but I don't
> think there's anything else I could have asked of GHC to make this any
> easier.
>
> But as you know there are several improvements that can be made to make
> what we've got better.  Are you blocked on anything wrt to adding direct
> LLVM support for the primops in question?
>
> On Wed, Nov 20, 2013 at 4:38 PM, Carter Schonwald <
> carter.schonwald at gmail.com> wrote:
>
>> I though Vector instances had their constructors exported so that you can
>> get at the underlying Primitive vectors, and and Primitive vectors have a
>> bytearray underneath!
>> I don't understand why Vector/MVector needs to be changed here to support
>> that info.
>> For the Atomic operations, it seems like you just really want to only
>> support the operations on vector types directly expressable with Primitive
>> vectors. Perhaps i'm not understanding though.
>>
>
> As far as I can see if the user gives you a "Data.Vector.Unboxed.MVector s
> Int8", what you're getting is the result of this type function:
>
>     newtype instance MVector s Int8 = MV_Int8 (P.MVector s Int8)
>
> .. from Unboxed.Base.hs.  The only thing that's provided for "MVector s a"
> types generally are instances of the Vector/MVector classes, which don't
> say how to get the pointer(s).
>
> BUT... you make a good point about the constructors (e.g. MV_Int8) being
> exposed!  It seems like we CAN make our own type family that mirrors the
> MVector one, and which leverages *each* of those "newtype instance"
> equations, matching on an MV_Int8 and grabbing the underlying Primitive
> vector... Nice!
>
>
>
>
> On Wed, Nov 20, 2013 at 10:57 AM, Ryan Newton <rrnewton at gmail.com> wrote:
>>
>>> We do expose CAS for boxed data, and we depend on that for various
>>> concurrent data structures (e.g. Michael-scott queues).
>>>
>>> But it's a messy business:
>>>
>>> <explanation> You have to fight hard against the GHC optimizer to
>>> prevent it from performing optimizations (e.g. unbox and rebox an Int) that
>>> completely destroy pointer equality (in all runs of the program).  The way
>>> that we've codified our solution to this is to use abstract "Ticket"s
>>> (based on the Any kind) that GHC is not supposed to be able to see through.
>>>  These are used to abstractly represent old reads when you come back to do
>>> a new CAS operation:
>>>
>>>
>>> http://hackage.haskell.org/package/atomic-primops-0.4/docs/Data-Atomics.html#g:2
>>>
>>> Even then, there was a bunch of careful NOINLINE's and other business
>>> necessary to achieve something workable, and it's highly GHC specific.  If
>>> we were to expose CAS on boxed "Data.Vector", I think it would only make
>>> sense as the ticketed interface above (raw CAS is useless, and will just
>>> condemn others to the same problems we had).
>>> </explanation>
>>>
>>> As a result of all this the CAS for Data.Vector would have a different
>>> signature (unless we wanted to force Storable/Unbox to use Tickets), and
>>> thus couldn't go in the "MVector" type class along with all the other basic
>>> operations that are uniform across representations.
>>>
>>> That said, it's easy to provide CAS from a separate "vector-atomics"
>>> package, because Data.Vector exposes the MVector constructor that lets you
>>> get at the underlying MutableArray.  So we certainly can provide the
>>> functionality somewhere, somehow.
>>>
>>>   -Ryan
>>>
>>>
>>>
>>> On Wed, Nov 20, 2013 at 10:21 AM, Jan-Willem Maessen <
>>> jmaessen at alum.mit.edu> wrote:
>>>
>>>> On Wed, Nov 20, 2013 at 10:06 AM, Ryan Newton <rrnewton at gmail.com>wrote:
>>>>
>>>>> (3) The most invasive (but best for the user) change would be to
>>>>> extend the basic MVector interface to include notions of
>>>>> concurrency-related operations right inside the vector package (CAS, etc).
>>>>>  But they should still probably go in a separate class (not class MVector),
>>>>> just because they will be specific to Unboxed and Storable vectors rather
>>>>> than boxed ones....
>>>>>
>>>>
>>>> Any reason we shouldn't be able to CAS on boxed vectors?  Every
>>>> architecture supports a pointer-sized CAS.  What "equality" means for CAS,
>>>> of course, has to be rather carefully defined, but that's equally true for
>>>> the unboxed types.
>>>>
>>>> -Jan
>>>>
>>>>
>>>>>
>>>>>   -Ryan
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Libraries mailing list
>>>>> Libraries at haskell.org
>>>>> http://www.haskell.org/mailman/listinfo/libraries
>>>>>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> Libraries mailing list
>>> Libraries at haskell.org
>>> http://www.haskell.org/mailman/listinfo/libraries
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20131121/90df5163/attachment.html>


More information about the Libraries mailing list