-
Notifications
You must be signed in to change notification settings - Fork 130
Shapes
Operations in Accelerate take the form of collective operations over arrays of the type Array sh e. The Array type has two type parameters; sh is the shape of the array, the number of dimensions; and e to represent the element type of the array, such as Int or Float. Before we can get started manipulating arrays, we need to grasp Accelerate's notion of array shape. Much like the Repa library, Accelerate arrays are parameterised via a type which determines the dimension of the array and the type of the index.
Shape types, and multi-dimensional array indices, are built somewhat like lists (technically, a heterogenous snoc list):
data Z = Z
data tail :. head = tail :. headHere, the constructor Z corresponds to a shape with zero dimension (or a scalar, with one element) and is used to mark the end of the list. The (:.) constructor adds additional dimensions to the shape. For example:
Z :. Intis the shape type of a one-dimensional array (a vector) indexed by an Int, while
Z :. Int :. Intis the shape of a two-dimensional array (a matrix) indexed by an Int in each dimension. In fact, Int is the only index type allowed at this time. Note that (:.) associates to the left, so Z :. Int :. Int is equivalent to (Z :. Int) :. Int, hence the heat / tail naming in the definition.
This style is used to construct both the type and value of a shape. For example, to define the shape of a vector of ten elements:
sh :: Z :. Int
sh = Z :. 10There are also some handy type synonyms available:
type DIM0 = Z
type DIM1 = DIM0 :. Int
type DIM2 = DIM1 :. Int
type DIM3 = DIM2 :. Int
-- and so on...
type Array DIM0 e = Scalar e
type Array DIM1 e = Vector eIn the next section, we will further see how to use shapes when we discuss operations for inputting array data, before moving onto the Accelerate DSL itself.