![]() |
Vc
0.7.5-dev
SIMD Vector Classes for C++
|
|
Wraps a pointer to memory with convenience functions to access it via vectors.
| S | The type of the struct. |
| V | The type of the vector to be returned when read. This should reflect the type of the members inside the struct. |
#include <Vc/Memory>
Public Member Functions | |
| InterleavedMemoryWrapper (S *s) | |
| Constructs the wrapper object. | |
| Access | operator[] (IndexType indexes) |
| Interleaved scatter/gather access. | |
| ReadAccess | operator[] (const IndexType indexes) const |
| const overload (gathers only) of the above function | |
| ReadAccess | gather (const IndexType indexes) const |
| alias of the above function | |
| InterleavedMemoryWrapper | ( | S * | s | ) |
Constructs the wrapper object.
| s | A pointer to a C-array. |
| Access operator[] | ( | IndexType | indexes | ) |
Interleaved scatter/gather access.
Assuming you have a struct of floats and a vector of indexes into the array, this function can be used to access the struct entries as vectors using the minimal number of store or load instructions.
| indexes | Vector of indexes that determine the gather locations. |
Example:
You may think of the gather operation (or scatter as the inverse) like this:
Memory: {x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4 x5 y5 z5 x6 y6 z6 x7 y7 z7 x8 y8 z8}
indexes: [5, 0, 1, 7]
Result in (x, y, z): ({x5 x0 x1 x7}, {y5 y0 y1 y7}, {z5 z0 z1 z7})
indexes contains non-unique entries on scatter, the result is undefined. If NDEBUG is not defined the implementation will assert that the indexes entries are unique.