[Haskell-cafe] vector-simd: some code available, and some questions

Nicolas Trangez nicolas at incubaid.com
Sun Jul 8 03:05:35 CEST 2012


On Sun, 2012-07-08 at 01:40 +0200, Gábor Lehel wrote:
>  unsafeXorSSE42 :: (Storable a,
> >     SV.AlignedToAtLeast SV.A16 o1, SV.Alignment o1,
> >     SV.AlignedToAtLeast SV.A16 o2, SV.Alignment o2,
> >     SV.AlignedToAtLeast SV.A16 o3, SV.Alignment o3) =>
> >     SV.Vector o1 a -> SV.Vector o2 a -> SV.Vector o3 a
> 
> I wonder if you could get that a bit shorter... I suppose you could write:
> 
> instance (AlignedToAtLeast n a, AlignedToAtLeast n b) =>
> AlignedToAtLeast n (a, b)
> instance (AlignedToAtLeast n a, AlignedToAtLeast n b, AlignedToAtLeast
> n c) => AlignedToAtLeast n (a, b, c)
> ...and so on...

Once again, nifty! And implemented in [1].

> though it feels a little strange semantically (relating a tuple to a
> scalar), but I don't see what harm can come of it. And then you can
> just write SV.AlignedToAtLeast SV.A16 (o1, o2, o3) in signatures.

> You
> can also make (Alignment n, Alignment a) a superclass constraint of
> AlignedToAtLeast, and write instances for Alignment inductively on One
> and Twice, and then you don't have to write Alignment o1 etc.
> separately either. So the signature would be just:
> 
> unsafeXorSSE42 :: (Storable a, SV.AlignedToAtLeast SV.A16 (o1, o2,
> o3)) =>      SV.Vector o1 a -> SV.Vector o2 a -> SV.Vector o3 a
> 
> which is friendlier.

I implemented the inductive alignment calculation over One and Twice
(good idea, and easy to do), but I don't get the thing about
superclasses. I've been trying several approaches (including definitions
based on forall and other trickery I never used before), but didn't get
things to work, at least: the compiler always said I'd need
UndecidableInstances, and that sounds scary... Care to elaborate?

Thanks!

Nicolas

[1]
https://github.com/NicolasT/vector-simd/commit/aedf25460b410e04a3d103befea59ebcb3903fdc




More information about the Haskell-Cafe mailing list