[Haskell-cafe] INLINABLE and SPECIALIZE, GHC 8.0.1

Carter Schonwald carter.schonwald at gmail.com
Sat Jun 18 03:51:50 UTC 2016


Specialize inline is its own pragma. Read
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html?highlight=specialize#specialize-pragma





On Friday, June 17, 2016, Jyotirmoy Bhattacharya <jyotirmoy at jyotirmoy.net>
wrote:

> Thanks! I could not find the SPECIALIZABLE pragma in the docs. Can you
> please give me a pointer. As to inline, while it would work, there might be
> a large cost in code size, if say the `insert` function of a hash table
> were to be inlined everywhere it is used in a program.
>
> Regards,
> Jyotirmoy
>
> On Fri, Jun 17, 2016 at 9:15 PM, Carter Schonwald <
> carter.schonwald at gmail.com
> <javascript:_e(%7B%7D,'cvml','carter.schonwald at gmail.com');>> wrote:
>
>> You probably want specializable and specialize inline pragmas.
>>
>>
>> On Friday, June 17, 2016, Jyotirmoy Bhattacharya <jyotirmoy at jyotirmoy.net
>> <javascript:_e(%7B%7D,'cvml','jyotirmoy at jyotirmoy.net');>> wrote:
>>
>>> Sorry, realized that attachments cannot be sent to the list. I have put
>>> the code on GitHub here https://github.com/jmoy/testing-specialize
>>>
>>> On Fri, Jun 17, 2016 at 4:31 PM, Jyotirmoy Bhattacharya <
>>> jyotirmoy at jyotirmoy.net> wrote:
>>>
>>>> I'm trying to write a mutable hash table library that would work both
>>>> in the IO and ST monads, so I'm using the PrimMonad typeclass [see
>>>> JmoyHash.hs  in the attached archive].
>>>>
>>>> For efficiency, I would like the functions to be specialized to the
>>>> concrete monad at the call site. According to Section 9.31.9.2 of the
>>>> GHC User's Guide
>>>> <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#specialize-for-imported-functions>
>>>>
>>>> The optimiser *also* considers each *imported* INLINABLE overloaded
>>>> function, and specialises it for the different types at which it is called
>>>> in M.
>>>>
>>>> So I marked all the functions in my library as INLINABLE. Yet adding a
>>>> SPECIALIZE pragma in Main.hs (currently commented out) for an imported
>>>> function improves runtime performance by 3x, which should not be happening
>>>> since, if I understand the manual right, the function should have been
>>>> specialized anyway since it is marked INLINABLE.
>>>>
>>>> I am writing to this list rather than filing a bug since I'm not sure
>>>> if I'm reading the manual right and I have not explicitly verified that the
>>>> specialization is not happening. I would greatly appreciate any help on
>>>> both counts.
>>>>
>>>> I'm using GHC 8.0.1 with the -O2 flag.
>>>>
>>>> Marking the function as INLINE might solve the problem but that's
>>>> something I don't want to do as it seems to me that specialization and not
>>>> inlining is what's appropriate here.
>>>>
>>>> Regards,
>>>> Jyotirmoy Bhattacharya
>>>>
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160617/3fce2418/attachment.html>


More information about the Haskell-Cafe mailing list