This might be lost in the noise for MVar and TVar, but for arrays, there
are tremendous advantages to cutting out the extra heap objects.

On Thu, Oct 15, 2020, 1:10 PM Ryan Yates <fryguy...@gmail.com> wrote:

> I haven't been following this discussion too closely, but in my research
> work I found that some of the benefits that I wanted in this direction were
> already there with pointer tagging.
>
> On Thu, Oct 15, 2020 at 12:59 PM David Feuer <david.fe...@gmail.com>
> wrote:
>
>> Yes, that's something quite different. We'd need a whole different heap
>> object type for such MVars and TVars. My approach covers the case where the
>> unboxed thing can only take on a few values, for some value of "a few"
>> which, depending on implementation, may or may not be very small. If the
>> nulls point to actual heap objects in pre-allocated pinned memory (say),
>> then up to 64 or so might be reasonable. If they point to "invalid" address
>> space, then the numbers could go up a good bit.
>>
>> On Thu, Oct 15, 2020, 12:50 PM Carter Schonwald <
>> carter.schonw...@gmail.com> wrote:
>>
>>> Indeed, I mean things that aren’t pointery, and could be represented by
>>> a tvar paired with a mutable byte array or mvar with mutable byte array,
>>> but which we’d want considered as a single heap object from the rts/gc
>>> perspective.
>>>
>>> On Thu, Oct 15, 2020 at 11:58 AM David Feuer <david.fe...@gmail.com>
>>> wrote:
>>>
>>>> Sorry, unlifted, not unboxed...
>>>>
>>>> On Thu, Oct 15, 2020, 11:57 AM David Feuer <david.fe...@gmail.com>
>>>> wrote:
>>>>
>>>>> Putting unboxed things in TVar, MVar, etc., is part of Andrew Martin's
>>>>> accepted BoxedRep proposal.
>>>>>
>>>>> On Thu, Oct 15, 2020, 11:44 AM Carter Schonwald <
>>>>> carter.schonw...@gmail.com> wrote:
>>>>>
>>>>>> A related idea that came up recently and is perhaps simpler ties into
>>>>>> this via the lens of having unboxed Mvars/tvars (even if it’s restricted 
>>>>>> to
>>>>>> just things we can embed in a word64#)
>>>>>>
>>>>>> This came up in
>>>>>> https://gitlab.haskell.org/ghc/ghc/-/issues/18798#note_307410, where
>>>>>> viktor had millions of independent mvars holding what’s essentially a
>>>>>> strict unit ()!
>>>>>>
>>>>>> The motivation in this later scenario is that in high concurrency
>>>>>> settings, the less trivial stuff the gc needs to trace under updates, the
>>>>>> better ghc scales.
>>>>>>
>>>>>> This may not be a use case david has in mind, but certainly seems
>>>>>> related.
>>>>>>
>>>>>> Phrased more succinctly: gc perf dominates large heap / many core
>>>>>> computation in Haskell via sensitivity to allocation volume / mutation
>>>>>> volume (to ensure generational hypothesis stays valid), and providing 
>>>>>> tools
>>>>>> to incrementally reduce the pressure with local changes would be good.
>>>>>>
>>>>>> So I’d propose / suggest that a baby step towards what david asks
>>>>>> would be for us to work out some manner of unboxed tvar/mvar ref 
>>>>>> machinery
>>>>>> that supports unboxed values.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Oct 15, 2020 at 5:32 AM Andreas Klebinger <
>>>>>> klebinger.andr...@gmx.at> wrote:
>>>>>>
>>>>>>> From a implementors perspective my main questions would be:
>>>>>>>
>>>>>>> * How big is the benefit in practice? How many use cases are there?
>>>>>>> * How bad are the costs? (Runtime overhead, rts complexity, ...)
>>>>>>>
>>>>>>> The details of how this would be exposed to a user would are
>>>>>>> important.
>>>>>>> But if the costs are too high for the drawbacks then it becomes a
>>>>>>> moot point.
>>>>>>>
>>>>>>>
>>>>>>> David Feuer schrieb am 14.10.2020 um 22:21:
>>>>>>>
>>>>>>> Forwarded from Andrew Martin below. I think we want more than just
>>>>>>> Maybe (more than one null), but the nesting I described is certainly 
>>>>>>> more
>>>>>>> convenience than necessity.
>>>>>>>
>>>>>>> ---------- Forwarded message ---------
>>>>>>> From: Andrew Martin <andrew.thadd...@gmail.com>
>>>>>>> Date: Wed, Oct 14, 2020, 4:14 PM
>>>>>>> Subject: Re: Restricted sums in BoxedRep
>>>>>>> To: David Feuer <david.fe...@gmail.com>
>>>>>>>
>>>>>>>
>>>>>>> You'll have to forward this to the ghc-devs list to share it with
>>>>>>> others since I'm not currently subscribed to it, but I've had this same
>>>>>>> thought before. It is discussed at
>>>>>>> https://github.com/andrewthad/impure-containers/issues/12. Here's
>>>>>>> the relevant excerpt:
>>>>>>>
>>>>>>>> Relatedly, I was thinking the other day that after finishing
>>>>>>>> implementing
>>>>>>>> https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0203-pointer-rep.rst,
>>>>>>>> I should really look at seeing if it's possible to add this
>>>>>>>> maybe-of-a-lifted value trick straight to GHC. I think that with:
>>>>>>>>
>>>>>>>> data RuntimpRep
>>>>>>>>   = BoxedRep Levity
>>>>>>>>   | MaybeBoxedRep Levity
>>>>>>>>   | IntRep
>>>>>>>>   | ...
>>>>>>>>
>>>>>>>> data BuiltinMaybe :: forall (v :: Levity). TYPE v -> TYPE 
>>>>>>>> ('MaybeBoxedRep v)
>>>>>>>>
>>>>>>>> This doesn't have the nesting issues because the kind system
>>>>>>>> prevents nesting. But anyway, back to the original question. I would
>>>>>>>> recommend not using Maybe.Unsafe and using unpacked-maybe instead.
>>>>>>>> The latter is definitely safe, and it only costs an extra machine word 
>>>>>>>> of
>>>>>>>> space in each data constructor it gets used in, and it doesn't 
>>>>>>>> introduce
>>>>>>>> more indirections.
>>>>>>>>
>>>>>>>
>>>>>>> On Tue, Oct 13, 2020 at 5:47 PM David Feuer <david.fe...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Null pointers are widely known to be a lousy language feature in
>>>>>>>> general, but there are certain situations where they're *really* 
>>>>>>>> useful for
>>>>>>>> compact representation. For example, we define
>>>>>>>>
>>>>>>>>     newtype TMVar a = TMVar (TVar (Maybe a))
>>>>>>>>
>>>>>>>> We don't, however, actually use the fact that (Maybe a) is lifted.
>>>>>>>> So we could represent this much more efficiently using something like
>>>>>>>>
>>>>>>>>     newtype TMVar a = TMVar (TVar a)
>>>>>>>>
>>>>>>>> where Nothing is represented by a distinguished "null" pointer.
>>>>>>>>
>>>>>>>> While it's possible to implement this sort of thing in user code
>>>>>>>> (with lots of fuss and care), it's not very nice at all. What I'd 
>>>>>>>> really
>>>>>>>> like to be able to do is represent certain kinds of sums like this 
>>>>>>>> natively.
>>>>>>>>
>>>>>>>> Now that we're getting BoxedRep, I think we can probably make it
>>>>>>>> happen. The trick is to add a special Levity constructor representing 
>>>>>>>> sums
>>>>>>>> of particular shapes. Specifically, we can represent a type like this 
>>>>>>>> if it
>>>>>>>> is a possibly-nested sum which, when flattened into a single sum, 
>>>>>>>> consists
>>>>>>>> of some number of nullary tuples and at most one Lifted or Unlifted 
>>>>>>>> type.
>>>>>>>> Then we can have (inline) primops to convert between the BoxedRep and 
>>>>>>>> the
>>>>>>>> sum-of-sums representations.
>>>>>>>>
>>>>>>>> Anyone have thoughts on details for what the Levity constructor
>>>>>>>> arguments might look like?
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> -Andrew Thaddeus Martin
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> ghc-devs mailing 
>>>>>>> listghc-devs@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> ghc-devs mailing list
>>>>>>> ghc-devs@haskell.org
>>>>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>>>>>>
>>>>>> _______________________________________________
>> ghc-devs mailing list
>> ghc-devs@haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>
>
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to