On Jan 7, 2014, at 2:27 AM, Ben Lippmeier <b...@ouroborus.net> wrote:
> On 07/01/2014, at 9:26 , Adam Wick <aw...@galois.com> wrote:
> 
>>> Not if we just have this one test. I'd be keen to blame excessive use of 
>>> inline pragmas in the SHA library itself, or excessive optimisation flags. 
>>> It's not really a bug in GHC until there are two tests that exhibit the 
>>> same problem.
>> 
>> The SHA library uses SPECIALIZE, INLINE, and bang patterns in fairly 
>> standard ways. There’s nothing too exotic in there, I just basically 
>> sprinkled hints in places I thought would be useful, and then backed those 
>> up with benchmarking.
> 
> Ahh. It's the "sprinkled hints in places I thought would be useful" which is 
> what I'm concerned about. If you just add pragmas without understanding their 
> effect on the core program then it'll bite further down the line. Did you 
> compare the object code size as well as wall clock speedup?

I understand the pragmas and what they do with my code. I use SPECIALIZE twice 
for two functions. In both functions, it was clearer to write the function as 
(a -> a -> a -> a), but I wanted specialized versions for the two versions that 
were going to be used, in which (a == Word32) or (a == Word64). This 
benchmarked as faster while maintaining code clarity and concision. I use 
INLINE in five places, each of them a SHA step function, with the understanding 
that it would generate ideal code for a compiler for the performance-critical 
parts of the algorithm: straight line, single-block code with no conditionals.

When I did my original performance work, several versions of GHC ago, I did 
indeed consider compile time, runtime performance, and space usage. I picked 
what I thought was a reasonable balance at the time.

I also just performed an experiment in which I took the SHA library, deleted 
all instances of INLINE and SPECIALIZE, and compiled it with HEAD on 32-bit 
Linux. You get the same crash. So my usage of SPECIALIZE and INLINE is beside 
the point. 

> Sadly, "valid input" isn't a well defined concept in practice. You could 
> write a "valid" 10GB Haskell source file that obeyed the Haskell standard 
> grammar, but I wouldn't expect that to compile either.

I would. I’m a little disappointed that ghc-devs does not. I wouldn’t expect it 
to compile quickly, but I would expect it to run.

> You could also write small (< 1k) source programs that trigger complexity 
> problems in Hindley-Milner style type inference. You could also use 
> compile-time meta programming (like Template Haskell) to generate 
> intermediate code that is well formed but much too big to compile. The fact 
> that a program obeys a published grammar is not sufficient to expect it to 
> compile with a particular implementation (sorry to say).

If I write a broken Template Haskell macro, then yes, I agree. This is not the 
case in this example.

> Adding an INLINE pragma is akin to using compile-time meta programming.

Is it? I find that a strange point of view. Isn’t INLINE just a strong hint to 
the compiler that this function should be inlined? How is using INLINE any 
different from simply manually inserting the code at every call site?


- Adam

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to