Vector Arguments in VM

Vector arguments of VM mathematical functions are passed in one-dimensional arrays with unit vector increment. It means that a vector of length n is passed contiguously in an array a whose values are defined as

a(1), a(2), ..., a(n)


To accommodate for arrays with other increments, or more complicated indexing, VM contains auxiliary pack/unpack functions that gather the array elements into a contiguous vector and then scatter them after the computation is complete.

Generally, if the vector elements are stored in a one-dimensional array a as

a(m0), a(m1), ..., a(mn-1)

and need to be regrouped into an array y as

y(k0), y(k1), ..., y(kn-1),


VM pack/unpack functions can use one of the following indexing methods:

Positive Increment Indexing

kj = incy * j, mj = inca * j, j = 1 ,..., n


Constraint: incy > 0 and inca > 0.

For example, setting incy = 1 specifies gathering array elements into a contiguous vector.

This method is similar to that used in BLAS, with the exception that negative and zero increments are not permitted.

Index Vector Indexing

kj = iy(j), mj = ia(j), j = 1 ,..., n,


where ia and iy are arrays of length n that contain index vectors for the input and output arrays a and y, respectively.

Mask Vector Indexing

Indices kj , mj are such that:

my(kj)  0, ma(mj)  0 , j = 1,..., n,


where ma and my are arrays that contain mask vectors for the input and output arrays a and y, respectively.

For more complete information about compiler optimizations, see our Optimization Notice.