Vc  1.1.0
SIMD Vector Classes for C++
Memory< V, 0u, 0u, true > Class Template Reference

Detailed Description

template<typename V>
class Vc::Common::Memory< V, 0u, 0u, true >

A helper class that is very similar to Memory<V, Size> but with dynamically allocated memory and thus dynamic size.

Example:

size_t size = 11;
Vc::Memory<int_v> array(size);
// scalar access:
for (size_t i = 0; i < array.entriesCount(); ++i) {
array[i] = i;
}
// vector access:
for (size_t i = 0; i < array.vectorsCount(); ++i) {
array.vector(i) = int_v::IndexesFromZero() + i * int_v::Size;
}

This code allocates a small array with 11 scalar entries and implements two equivalent loops that initialize the memory. The scalar loop writes each individual int. The vectorized loop writes int_v::Size values to memory per iteration. Since the size of 11 is not a multiple of int_v::Size (unless you use the scalar Vc implementation) the last write access of the vector loop would normally be out of bounds. But the Memory class automatically pads the memory such that the whole array can be accessed with correctly aligned memory addresses. (Note: the scalar loop can be auto-vectorized, except for the last three assignments.)

Note
The internal data pointer is not declared with the restrict keyword. Therefore modifying memory of V::EntryType will require the compiler to assume aliasing. If you want to use the restrict keyword you need to use a standard pointer to memory and do the vector address calculation and loads and stores manually.
Parameters
VThe vector type you want to operate on. (e.g. float_v or uint_v)
See also
Memory<V, Size>

Definition at line 436 of file memory.h.

#include <Vc/Memory>

Inherits MemoryBase< V, Memory< V, 0u, 0u, true >, 1, void >.

Public Member Functions

 Memory (size_t size)
 Allocate enough memory to access size values of type V::EntryType. More...
 
template<typename Parent , typename RM >
 Memory (const MemoryBase< V, Parent, 1, RM > &rhs)
 Copy the memory into a new memory area. More...
 
 Memory (const Memory &rhs)
 Overload of the above function. More...
 
 ~Memory ()
 Frees the memory which was allocated in the constructor.
 
void swap (Memory &rhs)
 Swap the contents and size information of two Memory objects. More...
 
size_t entriesCount () const
 
size_t vectorsCount () const
 
template<typename Parent , typename RM >
Memoryoperator= (const MemoryBase< V, Parent, 1, RM > &rhs)
 Overwrite all entries with the values stored in rhs. More...
 
Memoryoperator= (const EntryType *rhs)
 Overwrite all entries with the values stored in the memory at rhs. More...
 
MemoryVectorIterator< V, Flags > begin (Flags flags=Flags())
 Return a (vectorized) iterator to the start of this memory object.
 
MemoryVectorIterator< const V, Flags > begin (Flags flags=Flags()) const
 const overload of the above
 
MemoryVectorIterator< V, Flags > end (Flags flags=Flags())
 Return a (vectorized) iterator to the end of this memory object.
 
MemoryVectorIterator< const V, Flags > end (Flags flags=Flags()) const
 const overload of the above
 
std::enable_if<!std::is_convertible< Flags, int >::value, MemoryVector< V, Flags > >::type & vector (size_t i, Flags=Flags())
 
std::enable_if<!std::is_convertible< Flags, int >::value, MemoryVector< const V, Flags > >::type & vector (size_t i, Flags=Flags()) const
 Const overload of the above function. More...
 
std::enable_if< std::is_convertible< ShiftT, int >::value, MemoryVector< V, decltype(std::declval< Flags >)|Unaligned)> >::type & vector (size_t i, ShiftT shift, Flags=Flags())
 
std::enable_if< std::is_convertible< ShiftT, int >::value, MemoryVector< const V, decltype(std::declval< Flags >)|Unaligned)> >::type & vector (size_t i, ShiftT shift, Flags=Flags()) const
 Const overload of the above function.
 
MemoryVector< V, Flags > & vectorAt (size_t i, Flags flags=Flags())
 
MemoryVector< const V, Flags > & vectorAt (size_t i, Flags flags=Flags()) const
 Const overload of the above function. More...
 
MemoryVector< V, Flags > & firstVector (Flags=Flags())
 
MemoryVector< const V, Flags > & firstVector (Flags=Flags()) const
 Const overload of the above function.
 
MemoryVector< V, Flags > & lastVector (Flags=Flags())
 
MemoryVector< const V, Flags > & lastVector (Flags=Flags()) const
 Const overload of the above function.
 
void setZero ()
 Zero the whole memory area.
 
Memory< V, 0u, 0u, true > & operator+= (const MemoryBase< V, P2, Dimension, RM > &rhs)
 (Inefficient) shorthand to add up two arrays.
 
Memory< V, 0u, 0u, true > & operator+= (EntryType rhs)
 (Inefficient) shorthand to add a value to an array.
 
Memory< V, 0u, 0u, true > & operator-= (const MemoryBase< V, P2, Dimension, RM > &rhs)
 (Inefficient) shorthand to subtract two arrays.
 
Memory< V, 0u, 0u, true > & operator-= (EntryType rhs)
 (Inefficient) shorthand to subtract a value from an array.
 
Memory< V, 0u, 0u, true > & operator*= (const MemoryBase< V, P2, Dimension, RM > &rhs)
 (Inefficient) shorthand to multiply two arrays.
 
Memory< V, 0u, 0u, true > & operator*= (EntryType rhs)
 (Inefficient) shorthand to multiply a value to an array.
 
Memory< V, 0u, 0u, true > & operator/= (const MemoryBase< V, P2, Dimension, RM > &rhs)
 (Inefficient) shorthand to divide two arrays.
 
Memory< V, 0u, 0u, true > & operator/= (EntryType rhs)
 (Inefficient) shorthand to divide an array with a value.
 
bool operator== (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare equality of two arrays.
 
bool operator!= (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare two arrays.
 
bool operator< (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare two arrays.
 
bool operator<= (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare two arrays.
 
bool operator> (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare two arrays.
 
bool operator>= (const MemoryBase< V, P2, Dimension, RM > &rhs) const
 (Inefficient) shorthand compare two arrays.
 

Constructor & Destructor Documentation

Memory ( size_t  size)
inline

Allocate enough memory to access size values of type V::EntryType.

The allocated memory is aligned and padded correctly for fully vectorized access.

Parameters
sizeDetermines how many scalar values will fit into the allocated memory.

Definition at line 466 of file memory.h.

Memory ( const MemoryBase< V, Parent, 1, RM > &  rhs)
inline

Copy the memory into a new memory area.

The allocated memory is aligned and padded correctly for fully vectorized access.

Parameters
rhsThe Memory object to copy from.

Definition at line 483 of file memory.h.

Memory ( const Memory< V, 0u, 0u, true > &  rhs)
inline

Overload of the above function.

(Because C++ would otherwise not use the templated cctor and use a default-constructed cctor instead.)

Parameters
rhsThe Memory object to copy from.

Definition at line 498 of file memory.h.

Member Function Documentation

void swap ( Memory< V, 0u, 0u, true > &  rhs)
inline

Swap the contents and size information of two Memory objects.

Parameters
rhsThe other Memory object to swap.

Definition at line 519 of file memory.h.

size_t entriesCount ( ) const
inline
Returns
the number of scalar entries in the whole array.

Definition at line 528 of file memory.h.

size_t vectorsCount ( ) const
inline
Returns
the number of vectors in the whole array.

Definition at line 533 of file memory.h.

Memory& operator= ( const MemoryBase< V, Parent, 1, RM > &  rhs)
inline

Overwrite all entries with the values stored in rhs.

Parameters
rhsThe object to copy the data from.
Returns
reference to the modified Memory object.
Note
this function requires the vectorsCount() of both Memory objects to be equal.

Definition at line 545 of file memory.h.

Memory& operator= ( const EntryType *  rhs)
inline

Overwrite all entries with the values stored in the memory at rhs.

Parameters
rhsThe array to copy the data from.
Returns
reference to the modified Memory object.
Note
this function requires that there are entriesCount() many values accessible from rhs.

Definition at line 566 of file memory.h.

std::enable_if<!std::is_convertible<Flags, int>::value, MemoryVector<V, Flags> >::type& vector ( size_t  i,
Flags  = Flags() 
)
inlineinherited
Parameters
iSelects the offset, where the vector should be read.
Returns
a smart object to wrap the i-th vector in the memory.

The return value can be used as any other vector object. I.e. you can substitute something like

float_v a = ..., b = ...;
a += b;

with

mem.vector(i) += b;

This function ensures that only aligned loads and stores are used. Thus it only allows to access memory at fixed strides. If access to known offsets from the aligned vectors is needed the vector(size_t, int) function can be used.

Definition at line 417 of file memorybase.h.

std::enable_if<!std::is_convertible<Flags, int>::value, MemoryVector<const V, Flags> >::type& vector ( size_t  i,
Flags  = Flags() 
) const
inlineinherited

Const overload of the above function.

Parameters
iSelects the offset, where the vector should be read.
Returns
a smart object to wrap the i-th vector in the memory.

Definition at line 427 of file memorybase.h.

std::enable_if< std::is_convertible<ShiftT, int>::value, MemoryVector<V, decltype(std::declval<Flags>) | Unaligned)> >::type& vector ( size_t  i,
ShiftT  shift,
Flags  = Flags() 
)
inlineinherited
Returns
a smart object to wrap the i-th vector + shift in the memory.

This function ensures that only unaligned loads and stores are used. It allows to access memory at any location aligned to the entry type.

Parameters
iSelects the memory location of the i-th vector. Thus if V::Size == 4 and i is set to 3 the base address for the load/store will be the 12th entry (same as &mem[12]).
shiftShifts the base address determined by parameter i by shift many entries. Thus vector(3, 1) for V::Size == 4 will load/store the 13th - 16th entries (same as &mem[13]).
Note
Any shift value is allowed as long as you make sure it stays within bounds of the allocated memory. Shift values that are a multiple of V::Size will not result in aligned loads. You have to use the above vector(size_t) function for aligned loads instead.
Thus a simple way to access vectors randomly is to set i to 0 and use shift as the parameter to select the memory address:
// don't use:
mem.vector(i / V::Size, i % V::Size) += 1;
// instead use:
mem.vector(0, i) += 1;

Definition at line 501 of file memorybase.h.

MemoryVector<V, Flags>& vectorAt ( size_t  i,
Flags  flags = Flags() 
)
inlineinherited
Returns
a smart object to wrap the vector starting from the i-th scalar entry in the memory.

Example:

Memory<float_v, N> mem;
mem.setZero();
for (int i = 0; i < mem.entriesCount(); i += float_v::Size) {
mem.vectorAt(i) += b;
}
Parameters
iSpecifies the scalar entry from where the vector will be loaded/stored. I.e. the values scalar(i), scalar(i + 1), ..., scalar(i + V::Size - 1) will be read/overwritten.
flagsYou must take care to determine whether an unaligned load/store is required. Per default an unaligned load/store is used. If i is a multiple of V::Size you may want to pass Vc::Aligned here.

Definition at line 451 of file memorybase.h.

MemoryVector<const V, Flags>& vectorAt ( size_t  i,
Flags  flags = Flags() 
) const
inlineinherited

Const overload of the above function.

Returns
a smart object to wrap the vector starting from the i-th scalar entry in the memory.
Parameters
iSpecifies the scalar entry from where the vector will be loaded/stored. I.e. the values scalar(i), scalar(i + 1), ..., scalar(i + V::Size - 1) will be read/overwritten.
flagsYou must take care to determine whether an unaligned load/store is required. Per default an unaligned load/store is used. If i is a multiple of V::Size you may want to pass Vc::Aligned here.

Definition at line 466 of file memorybase.h.

MemoryVector<V, Flags>& firstVector ( Flags  = Flags())
inlineinherited
Returns
the first vector in the allocated memory.

This function is simply a shorthand for vector(0).

Definition at line 523 of file memorybase.h.

MemoryVector<V, Flags>& lastVector ( Flags  = Flags())
inlineinherited
Returns
the last vector in the allocated memory.

This function is simply a shorthand for vector(vectorsCount() - 1).

Definition at line 538 of file memorybase.h.


The documentation for this class was generated from the following file: