In terms of normal haskell user experience, would it perhaps be a good ideas to have information like "this inlinable function transitively calls an inlinable function that uses a SIMD primop" in the *.hi files?

that way we can, before code gen time, give a warning that compilation of client module might fail without -fllvm? (whether it fails or not depends on how much inlining actually happens )




On Tue, Sep 24, 2013 at 7:25 AM, Simon Marlow <marlowsd@gmail.com> wrote:
Yes - it's really just an aesthetic issue, but I think it would be nice if we know that there's only one pass where these errors show up, so we don't have to worry about emitting a helpful "sorry" rather than a panic in other places too.

Cheers,
        Simon


On 23/09/2013 21:52, Geoffrey Mainland wrote:
The NCG checks for this, but maybe it would be better to add a check in
cmm/CmmCallConv.hs? What do you think?

Geoff

On 09/23/2013 06:31 AM, Simon Marlow wrote:
Hey Geoff,

Sorry for not getting around to reviewing this.  I just skimmed the
patches and didn't spot anything obviously bogus.

Regarding the sorry errors, are primops the only place that we need to
check?  Is it possible that the user might try to call a function that
takes a SIMD argument and make the NCG fall over that way?

Cheers,
Simon

On 16/09/2013 15:16, Geoffrey Mainland wrote:
The SIMD branch, available as wip/simd, is ready for review/merge. It
could use some review---Simon and Simon, I'd be especially grateful if
you both had a quick look. Some major points:

1) I have added support for AVX 512, although this is necessarily
untested. AVX and AVX2 are also both supported.

2) After the recent churn regarding patching LLVM's GHC calling
convention, by default only 128-bit wide SIMD vectors are passed in
registers, and then only on X86_64. There is a "hidden" flag,
-fllvm-pass-vectors-in-regs, that causes GHC to generate LLVM code that
assumes all vectors are passed in registers by LLVM. This can be used
with a suitably patched version of LLVM, and if we get LLVM 3.4 patched,
we can consider turning it on by default for LLVM 3.4+. This would mean
that we couldn't mix LLVM <3.3-compiled object files with LLVM
3.4-compiled object files, but I don't see that as much of a problem.
3) utils/genprimcode has been hacked up to allow us to write vector
operations once and have them instantiated at multiple vector types. I'm
not thrilled with this solution, but after discussing with Simon PJ,
what I've implemented seems to be the minimal reasonable solution to the
problem of exploding primop boilerplate. The changes are documented in
compiler/prelude/primops.txt.pp.

4) Error handling is sub-optimal. My patch checks to make sure that
vector primops can be compiled efficiently based on the current set of
dynamic flags. For example, if -mavx is not specified and the user tries
to use a primop that adds together two 256-bit wide vectors of
double-precision elements, the user will see an error message like:

ghc-stage2: sorry! (unimplemented feature or known bug)
    (GHC version 7.7.20130916 for x86_64-unknown-linux):
      256-bit wide floating point SIMD vector instructions require at
least -mavx.

This is because the only good place to check for this kind of error is
during STG->Cmm translation (in compiler/codeGen/StgCmmPrim.hs), and we
don't have much of an error handling infrastructure there in contrast to
when we're working in the typechecking/renaming monad. If there is a
better way/place to do this, please let me know.

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

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


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