INLINABLE and SPECIALIZE, GHC 8.0.1

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... 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

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@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...
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

You probably want specializable and specialize inline pragmas.
On Friday, June 17, 2016, Jyotirmoy Bhattacharya
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@jyotirmoy.net javascript:_e(%7B%7D,'cvml','jyotirmoy@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...
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

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@gmail.com> wrote:
You probably want specializable and specialize inline pragmas.
On Friday, June 17, 2016, Jyotirmoy Bhattacharya
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@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...
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

Specialize inline is its own pragma. Read
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts...
On Friday, June 17, 2016, Jyotirmoy Bhattacharya
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@gmail.com javascript:_e(%7B%7D,'cvml','carter.schonwald@gmail.com');> wrote:
You probably want specializable and specialize inline pragmas.
On Friday, June 17, 2016, Jyotirmoy Bhattacharya
javascript:_e(%7B%7D,'cvml','jyotirmoy@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@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...
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
participants (2)
-
Carter Schonwald
-
Jyotirmoy Bhattacharya