Copyright | (c) 2015 Anselm Jonas Scholl |
---|---|
License | BSD3 |
Maintainer | anselm.scholl@tu-harburg.de |
Stability | experimental |
Portability | non-portable (uses GHC.Prim) |
Safe Haskell | None |
Language | Haskell2010 |
SIMD data types and functions.
- class (Num v, Real (Elem v)) => SIMDVector v where
- type Elem v
- type ElemTuple v
- nullVector :: v
- vectorSize :: v -> Int
- elementSize :: v -> Int
- broadcastVector :: Elem v -> v
- insertVector :: v -> Elem v -> Int -> v
- unsafeInsertVector :: v -> Elem v -> Int -> v
- mapVector :: (Elem v -> Elem v) -> v -> v
- zipVector :: (Elem v -> Elem v -> Elem v) -> v -> v -> v
- foldVector :: (Elem v -> Elem v -> Elem v) -> v -> Elem v
- sumVector :: v -> Elem v
- packVector :: ElemTuple v -> v
- unpackVector :: v -> ElemTuple v
- class SIMDVector v => SIMDIntVector v where
- quotVector :: v -> v -> v
- remVector :: v -> v -> v
- data Tuple64 a = Tuple64 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
- data Int8X16
- data Int8X32
- data Int8X64
- data Int16X8
- data Int16X16
- data Int16X32
- data Int32X4
- data Int32X8
- data Int32X16
- data Int64X2
- data Int64X4
- data Int64X8
- data Word8X16
- data Word8X32
- data Word8X64
- data Word16X8
- data Word16X16
- data Word16X32
- data Word32X4
- data Word32X8
- data Word32X16
- data Word64X2
- data Word64X4
- data Word64X8
- data FloatX4
- data FloatX8
- data FloatX16
- data DoubleX2
- data DoubleX4
- data DoubleX8
- data DoubleX16
SIMD type classes
class (Num v, Real (Elem v)) => SIMDVector v where Source
This class provides basic operations to create and consume SIMD types.
Numeric operations on members of this class should compile to single
SIMD instructions although not all operations are (yet) supported by
GHC (e.g. sqrt
, it is currently implemented as mapVector sqrt
which
has to unpack the vector, compute the results and pack them again).
nullVector, vectorSize, elementSize, broadcastVector, unsafeInsertVector, mapVector, zipVector, foldVector, packVector, unpackVector
Type of the elements in the vector
Type used to pack or unpack the vector
nullVector :: v Source
Vector with all elements initialized to zero.
vectorSize :: v -> Int Source
Number of components (scalar elements) in the vector. The argument is not evaluated.
elementSize :: v -> Int Source
Size of each (scalar) element in the vector in bytes. The argument is not evaluated.
broadcastVector :: Elem v -> v Source
Broadcast a scalar to all elements of a vector.
insertVector :: v -> Elem v -> Int -> v Source
Insert a scalar at the given position (starting from 0) in a vector. If the index is outside of the range an exception is thrown.
unsafeInsertVector :: v -> Elem v -> Int -> v Source
Insert a scalar at the given position (starting from 0) in a vector. If the index is outside of the range the behavior is undefined.
mapVector :: (Elem v -> Elem v) -> v -> v Source
Apply a function to each element of a vector. Be very careful not to map branching functions over a vector as they could lead to quite a bit of code bloat (or make sure they are tagged with NOINLINE).
zipVector :: (Elem v -> Elem v -> Elem v) -> v -> v -> v Source
Zip two vectors together using a combining function.
foldVector :: (Elem v -> Elem v -> Elem v) -> v -> Elem v Source
Fold the elements of a vector to a single value. The order in which the elements are combined is not specified.
sumVector :: v -> Elem v Source
Sum up the components of the vector. Equivalent to foldVector (+)
.
packVector :: ElemTuple v -> v Source
Pack some elements to a vector.
unpackVector :: v -> ElemTuple v Source
Unpack a vector.
class SIMDVector v => SIMDIntVector v where Source
Provides vectorized versions of quot
and rem
. Implementing their
type class is not possible for SIMD types as it would require
implementing toInteger
.
quotVector :: v -> v -> v Source
Rounds towards zero element-wise.
remVector :: v -> v -> v Source
Satisfies (quotVector x y) * y + (remVector x y) == x
.
SIMD data types
The compiler only supports tuples up to 62 elements, so we have to use our own data type.
Tuple64 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a |
Bounded Int8X16 Source | |
Eq Int8X16 Source | |
Num Int8X16 Source | |
Ord Int8X16 Source | |
Show Int8X16 Source | |
Storable Int8X16 Source | |
Prim Int8X16 Source | |
Unbox Int8X16 Source | |
SIMDIntVector Int8X16 Source | |
SIMDVector Int8X16 Source | |
Vector Vector Int8X16 Source | |
MVector MVector Int8X16 Source | |
data Vector Int8X16 = V_Int8X16 (Vector Int8X16) Source | |
type Elem Int8X16 = Int8 Source | |
type ElemTuple Int8X16 = (Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8) Source | |
data MVector s Int8X16 = MV_Int8X16 (MVector s Int8X16) Source |
Bounded Int8X32 Source | |
Eq Int8X32 Source | |
Num Int8X32 Source | |
Ord Int8X32 Source | |
Show Int8X32 Source | |
Storable Int8X32 Source | |
Prim Int8X32 Source | |
Unbox Int8X32 Source | |
SIMDIntVector Int8X32 Source | |
SIMDVector Int8X32 Source | |
Vector Vector Int8X32 Source | |
MVector MVector Int8X32 Source | |
data Vector Int8X32 = V_Int8X32 (Vector Int8X32) Source | |
type Elem Int8X32 = Int8 Source | |
type ElemTuple Int8X32 = (Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8) Source | |
data MVector s Int8X32 = MV_Int8X32 (MVector s Int8X32) Source |
Bounded Int16X8 Source | |
Eq Int16X8 Source | |
Num Int16X8 Source | |
Ord Int16X8 Source | |
Show Int16X8 Source | |
Storable Int16X8 Source | |
Prim Int16X8 Source | |
Unbox Int16X8 Source | |
SIMDIntVector Int16X8 Source | |
SIMDVector Int16X8 Source | |
Vector Vector Int16X8 Source | |
MVector MVector Int16X8 Source | |
data Vector Int16X8 = V_Int16X8 (Vector Int16X8) Source | |
type Elem Int16X8 = Int16 Source | |
type ElemTuple Int16X8 = (Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16) Source | |
data MVector s Int16X8 = MV_Int16X8 (MVector s Int16X8) Source |
Bounded Int16X16 Source | |
Eq Int16X16 Source | |
Num Int16X16 Source | |
Ord Int16X16 Source | |
Show Int16X16 Source | |
Storable Int16X16 Source | |
Prim Int16X16 Source | |
Unbox Int16X16 Source | |
SIMDIntVector Int16X16 Source | |
SIMDVector Int16X16 Source | |
Vector Vector Int16X16 Source | |
MVector MVector Int16X16 Source | |
data Vector Int16X16 = V_Int16X16 (Vector Int16X16) Source | |
type Elem Int16X16 = Int16 Source | |
type ElemTuple Int16X16 = (Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16) Source | |
data MVector s Int16X16 = MV_Int16X16 (MVector s Int16X16) Source |
Bounded Int16X32 Source | |
Eq Int16X32 Source | |
Num Int16X32 Source | |
Ord Int16X32 Source | |
Show Int16X32 Source | |
Storable Int16X32 Source | |
Prim Int16X32 Source | |
Unbox Int16X32 Source | |
SIMDIntVector Int16X32 Source | |
SIMDVector Int16X32 Source | |
Vector Vector Int16X32 Source | |
MVector MVector Int16X32 Source | |
data Vector Int16X32 = V_Int16X32 (Vector Int16X32) Source | |
type Elem Int16X32 = Int16 Source | |
type ElemTuple Int16X32 = (Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16, Int16) Source | |
data MVector s Int16X32 = MV_Int16X32 (MVector s Int16X32) Source |
Bounded Int32X4 Source | |
Eq Int32X4 Source | |
Num Int32X4 Source | |
Ord Int32X4 Source | |
Show Int32X4 Source | |
Storable Int32X4 Source | |
Prim Int32X4 Source | |
Unbox Int32X4 Source | |
SIMDIntVector Int32X4 Source | |
SIMDVector Int32X4 Source | |
Vector Vector Int32X4 Source | |
MVector MVector Int32X4 Source | |
data Vector Int32X4 = V_Int32X4 (Vector Int32X4) Source | |
type Elem Int32X4 = Int32 Source | |
type ElemTuple Int32X4 = (Int32, Int32, Int32, Int32) Source | |
data MVector s Int32X4 = MV_Int32X4 (MVector s Int32X4) Source |
Bounded Int32X8 Source | |
Eq Int32X8 Source | |
Num Int32X8 Source | |
Ord Int32X8 Source | |
Show Int32X8 Source | |
Storable Int32X8 Source | |
Prim Int32X8 Source | |
Unbox Int32X8 Source | |
SIMDIntVector Int32X8 Source | |
SIMDVector Int32X8 Source | |
Vector Vector Int32X8 Source | |
MVector MVector Int32X8 Source | |
data Vector Int32X8 = V_Int32X8 (Vector Int32X8) Source | |
type Elem Int32X8 = Int32 Source | |
type ElemTuple Int32X8 = (Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32) Source | |
data MVector s Int32X8 = MV_Int32X8 (MVector s Int32X8) Source |
Bounded Int32X16 Source | |
Eq Int32X16 Source | |
Num Int32X16 Source | |
Ord Int32X16 Source | |
Show Int32X16 Source | |
Storable Int32X16 Source | |
Prim Int32X16 Source | |
Unbox Int32X16 Source | |
SIMDIntVector Int32X16 Source | |
SIMDVector Int32X16 Source | |
Vector Vector Int32X16 Source | |
MVector MVector Int32X16 Source | |
data Vector Int32X16 = V_Int32X16 (Vector Int32X16) Source | |
type Elem Int32X16 = Int32 Source | |
type ElemTuple Int32X16 = (Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32) Source | |
data MVector s Int32X16 = MV_Int32X16 (MVector s Int32X16) Source |
Bounded Int64X2 Source | |
Eq Int64X2 Source | |
Num Int64X2 Source | |
Ord Int64X2 Source | |
Show Int64X2 Source | |
Storable Int64X2 Source | |
Prim Int64X2 Source | |
Unbox Int64X2 Source | |
SIMDIntVector Int64X2 Source | |
SIMDVector Int64X2 Source | |
Vector Vector Int64X2 Source | |
MVector MVector Int64X2 Source | |
data Vector Int64X2 = V_Int64X2 (Vector Int64X2) Source | |
type Elem Int64X2 = Int64 Source | |
type ElemTuple Int64X2 = (Int64, Int64) Source | |
data MVector s Int64X2 = MV_Int64X2 (MVector s Int64X2) Source |
Bounded Int64X4 Source | |
Eq Int64X4 Source | |
Num Int64X4 Source | |
Ord Int64X4 Source | |
Show Int64X4 Source | |
Storable Int64X4 Source | |
Prim Int64X4 Source | |
Unbox Int64X4 Source | |
SIMDIntVector Int64X4 Source | |
SIMDVector Int64X4 Source | |
Vector Vector Int64X4 Source | |
MVector MVector Int64X4 Source | |
data Vector Int64X4 = V_Int64X4 (Vector Int64X4) Source | |
type Elem Int64X4 = Int64 Source | |
type ElemTuple Int64X4 = (Int64, Int64, Int64, Int64) Source | |
data MVector s Int64X4 = MV_Int64X4 (MVector s Int64X4) Source |
Bounded Int64X8 Source | |
Eq Int64X8 Source | |
Num Int64X8 Source | |
Ord Int64X8 Source | |
Show Int64X8 Source | |
Storable Int64X8 Source | |
Prim Int64X8 Source | |
Unbox Int64X8 Source | |
SIMDIntVector Int64X8 Source | |
SIMDVector Int64X8 Source | |
Vector Vector Int64X8 Source | |
MVector MVector Int64X8 Source | |
data Vector Int64X8 = V_Int64X8 (Vector Int64X8) Source | |
type Elem Int64X8 = Int64 Source | |
type ElemTuple Int64X8 = (Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64) Source | |
data MVector s Int64X8 = MV_Int64X8 (MVector s Int64X8) Source |
Bounded Word8X16 Source | |
Eq Word8X16 Source | |
Num Word8X16 Source | |
Ord Word8X16 Source | |
Show Word8X16 Source | |
Storable Word8X16 Source | |
Prim Word8X16 Source | |
Unbox Word8X16 Source | |
SIMDIntVector Word8X16 Source | |
SIMDVector Word8X16 Source | |
Vector Vector Word8X16 Source | |
MVector MVector Word8X16 Source | |
data Vector Word8X16 = V_Word8X16 (Vector Word8X16) Source | |
type Elem Word8X16 = Word8 Source | |
type ElemTuple Word8X16 = (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8) Source | |
data MVector s Word8X16 = MV_Word8X16 (MVector s Word8X16) Source |
Bounded Word8X32 Source | |
Eq Word8X32 Source | |
Num Word8X32 Source | |
Ord Word8X32 Source | |
Show Word8X32 Source | |
Storable Word8X32 Source | |
Prim Word8X32 Source | |
Unbox Word8X32 Source | |
SIMDIntVector Word8X32 Source | |
SIMDVector Word8X32 Source | |
Vector Vector Word8X32 Source | |
MVector MVector Word8X32 Source | |
data Vector Word8X32 = V_Word8X32 (Vector Word8X32) Source | |
type Elem Word8X32 = Word8 Source | |
type ElemTuple Word8X32 = (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8) Source | |
data MVector s Word8X32 = MV_Word8X32 (MVector s Word8X32) Source |
Bounded Word16X32 Source | |
Eq Word16X32 Source | |
Num Word16X32 Source | |
Ord Word16X32 Source | |
Show Word16X32 Source | |
Storable Word16X32 Source | |
Prim Word16X32 Source | |
Unbox Word16X32 Source | |
SIMDIntVector Word16X32 Source | |
SIMDVector Word16X32 Source | |
Vector Vector Word16X32 Source | |
MVector MVector Word16X32 Source | |
data Vector Word16X32 = V_Word16X32 (Vector Word16X32) Source | |
type Elem Word16X32 = Word16 Source | |
type ElemTuple Word16X32 = (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16) Source | |
data MVector s Word16X32 = MV_Word16X32 (MVector s Word16X32) Source |
Eq FloatX4 Source | |
Floating FloatX4 Source | |
Fractional FloatX4 Source | |
Num FloatX4 Source | |
Ord FloatX4 Source | |
Show FloatX4 Source | |
Storable FloatX4 Source | |
Prim FloatX4 Source | |
Unbox FloatX4 Source | |
SIMDVector FloatX4 Source | |
Vector Vector FloatX4 Source | |
MVector MVector FloatX4 Source | |
data Vector FloatX4 = V_FloatX4 (Vector FloatX4) Source | |
type Elem FloatX4 = Float Source | |
type ElemTuple FloatX4 = (Float, Float, Float, Float) Source | |
data MVector s FloatX4 = MV_FloatX4 (MVector s FloatX4) Source |
Eq FloatX8 Source | |
Floating FloatX8 Source | |
Fractional FloatX8 Source | |
Num FloatX8 Source | |
Ord FloatX8 Source | |
Show FloatX8 Source | |
Storable FloatX8 Source | |
Prim FloatX8 Source | |
Unbox FloatX8 Source | |
SIMDVector FloatX8 Source | |
Vector Vector FloatX8 Source | |
MVector MVector FloatX8 Source | |
data Vector FloatX8 = V_FloatX8 (Vector FloatX8) Source | |
type Elem FloatX8 = Float Source | |
type ElemTuple FloatX8 = (Float, Float, Float, Float, Float, Float, Float, Float) Source | |
data MVector s FloatX8 = MV_FloatX8 (MVector s FloatX8) Source |
Eq FloatX16 Source | |
Floating FloatX16 Source | |
Fractional FloatX16 Source | |
Num FloatX16 Source | |
Ord FloatX16 Source | |
Show FloatX16 Source | |
Storable FloatX16 Source | |
Prim FloatX16 Source | |
Unbox FloatX16 Source | |
SIMDVector FloatX16 Source | |
Vector Vector FloatX16 Source | |
MVector MVector FloatX16 Source | |
data Vector FloatX16 = V_FloatX16 (Vector FloatX16) Source | |
type Elem FloatX16 = Float Source | |
type ElemTuple FloatX16 = (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float) Source | |
data MVector s FloatX16 = MV_FloatX16 (MVector s FloatX16) Source |