[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