SkePU 0.7
Classes | Public Member Functions | Friends
skepu::Matrix< T > Class Template Reference

A matrix container class (2D matrix), internally uses 1D container (std::vector) to store elements in a contiguous memory allocations. More...

#include <matrix.h>

List of all members.

Classes

class  iterator
 An matrix iterator class that tranverses row-wise. More...
class  proxy_elem
 A proxy class representing one element of Matrix. More...

Public Member Functions

T * GetArrayRep ()
void randomize (int min=0, int max=RAND_MAX)
 Randomizes the Matrix.
void save (const std::string &filename)
 Saves content of Matrix to a file.
void load (const std::string &filename, int rowWidth, int numRows=0)
 Loads the Matrix from a file.
 ~Matrix ()
 Matrix (size_type _rows, size_type _cols)
 Matrix (size_type _rows, size_type _cols, const T &val)
 Matrix (const Matrix< T > &copy)
size_type size () const
size_type total_rows () const
size_type total_cols () const
void change_layout ()
Matrix< T > & operator= (Matrix< T > &other)
Matrix< T > & operator= (const T &elem)
bool operator== (const Matrix< T > &c1)
bool operator!= (const Matrix< T > &c1)
bool operator< (const Matrix< T > &c1)
bool operator> (const Matrix< T > &c1)
bool operator<= (const Matrix< T > &c1)
bool operator>= (const Matrix< T > &c1)
Matrix< T > & subsection (size_type row, size_type col, size_type rowWidth, size_type colWidth)
iterator begin ()
const_iterator begin () const
iterator begin (unsigned row)
const_iterator begin (unsigned row) const
iterator end ()
const_iterator end () const
iterator end (unsigned row)
const_iterator end (unsigned row) const
std::pair< const_iterator,
const_iterator > 
col_iterator_range ()
col_iterator col_begin ()
col_iterator col_end ()
size_type capacity () const
void flush ()
bool empty () const
void clear ()
void swap (Matrix< T > &from)
device_pointer_type_cl updateDevice_CL (T *start, size_type rows, size_type cols, Device_CL *device, bool copy)
 Update device with matrix content.
void flush_CL ()
 Flushes the matrix.
device_pointer_type_cu updateDevice_CU (T *start, size_type rows, size_type cols, int deviceID, bool copy, bool usePitch=false)
 Update device with matrix content.
device_pointer_type_cu updateDevice_CU (T *start, size_type cols, int deviceID, bool copy)
 Update device with matrix content.
void flush_CU ()
 Flushes the matrix.
void updateHost () const
void invalidateDevice ()
void updateHostAndInvalidateDevice ()
const Matrix< T > & operator+= (const Matrix< T > &rhs)
const Matrix< T > & operator+= (const T &rhs)
const Matrix< T > & operator-= (const Matrix< T > &rhs)
const Matrix< T > & operator-= (const T &rhs)
const Matrix< T > & operator*= (const Matrix< T > &rhs)
const Matrix< T > & operator*= (const T &rhs)
const Matrix< T > & operator/= (const Matrix< T > &rhs)
const Matrix< T > & operator/= (const T &rhs)
const Matrix< T > & operator%= (const Matrix< T > &rhs)
const Matrix< T > & operator%= (const T &rhs)

Friends

std::ostream & operator<< (std::ostream &os, Matrix< T > &matrix)
 Overloaded stream operator, for testing purposes.

Detailed Description

template<typename T>
class skepu::Matrix< T >

A matrix container class (2D matrix), internally uses 1D container (std::vector) to store elements in a contiguous memory allocations.

A class representing the column-wise iterator for the Matrix data-type.

A skepu::Matrix is a 2D container that internally stores in a 1D std::vector to store elements in a contiguous memory allocations. Its interface and behaviour is largely compatible with skepu::Vector and std::vector but with some additions and variations. Instead of the regular element, it sometimes returns a proxy element so it can distinguish between reads and writes. It also keeps track of which parts of it are currently allocated and uploaded to the GPU. If a computation is done, changing the matrix in the GPU memory, it is not directly transferred back to the host memory. Instead, the Matrix waits until an element is accessed before any copying is done.

It also implements support for allocating and de-allocating page-locked memory using cudaMallocHost and cudaFreeHost. This could help is running asynchronous operations especially when using multiple CUDA devices. It can be enabled by defining USE_PINNED_MEMORY flag in the skeleton program.

::col_iterator

Author:
Usman Dastgeer
Version:
0.7

This class implements column-wise iterator for the Matrix data-type. As data is stored in row-major order column-wise access involve stride issues.


Constructor & Destructor Documentation

template<typename T>
skepu::Matrix< T >::~Matrix ( ) [inline]

Destructor, used to deallocate memory mainly, device memory.

template<typename T>
skepu::Matrix< T >::Matrix ( size_type  _rows,
size_type  _cols 
) [inline]

Constructor, used to allocate memory ($_rows * _cols$).

Parameters:
_rowsNumber of rows in the matrix.
_colsNumber of columns in the matrix.
template<typename T>
skepu::Matrix< T >::Matrix ( size_type  _rows,
size_type  _cols,
const T &  val 
) [inline]

Constructor, used to allocate memory ($_rows * _cols$). With a value ot initialize all elements.

Parameters:
_rowsNumber of rows in the matrix.
_colsNumber of columns in the matrix.
valA value to initialize all elements.
template<typename T>
skepu::Matrix< T >::Matrix ( const Matrix< T > &  copy) [inline]

Copy Constructor, used to assign copy of another matrix.

Parameters:
copyMatrix that is being assigned.

Update the matrix before assigning it to assign latest copy.

References skepu::Matrix< T >::total_cols(), skepu::Matrix< T >::total_rows(), and skepu::Matrix< T >::updateHost().

Here is the call graph for this function:


Member Function Documentation

template<typename T >
Matrix< T >::iterator skepu::Matrix< T >::begin ( )

Please refer to the documentation of std::vector and skepu::Matrix::iterator.

template<typename T >
Matrix< T >::const_iterator skepu::Matrix< T >::begin ( ) const

Please refer to the documentation of std::vector and skepu::Matrix::iterator.

template<typename T >
Matrix< T >::iterator skepu::Matrix< T >::begin ( unsigned  row)

Please refer to the documentation of std::vector and skepu::Matrix::iterator. Uses row to get an iterator for that row.

Parameters:
rowThe index of row from where to start iterator.
template<typename T >
Matrix< T >::const_iterator skepu::Matrix< T >::begin ( unsigned  row) const

Please refer to the documentation of std::vector and skepu::Matrix::iterator. Uses row to get an iterator for that row.

Parameters:
rowThe index of row from where to start iterator.
template<typename T >
Matrix< T >::size_type skepu::Matrix< T >::capacity ( ) const

Please refer to the documentation of std::vector.

template<typename T>
void skepu::Matrix< T >::change_layout ( ) [inline]

A small utility to change rows and columns numbers with each other. A Matrix (4x7) will become (7x4) after this function call without changing the actual values. Not similar to transpose where you actually change the values.

template<typename T >
void skepu::Matrix< T >::clear ( )

Please refer to the documentation of std::vector. Invalidates all copies before clear.

template<typename T >
Matrix< T >::col_iterator skepu::Matrix< T >::col_begin ( )

This works by taking a transpose of current matrix.

template<typename T >
Matrix< T >::col_iterator skepu::Matrix< T >::col_end ( )

This works by taking a transpose of current matrix.

template<typename T >
std::pair< typename Matrix< T >::const_iterator, typename Matrix< T >::const_iterator > skepu::Matrix< T >::col_iterator_range ( )

This works by taking a transpose of current matrix. Returns begin and end iterator as std::pair. Can be used to make read-onkly traversal.

template<typename T >
bool skepu::Matrix< T >::empty ( ) const

Please refer to the documentation of std::vector.

template<typename T >
Matrix< T >::iterator skepu::Matrix< T >::end ( )

Please refer to the documentation of std::vector and skepu::Matrix::iterator.

template<typename T >
Matrix< T >::const_iterator skepu::Matrix< T >::end ( ) const

Please refer to the documentation of std::vector and skepu::Matrix::iterator.

template<typename T >
Matrix< T >::iterator skepu::Matrix< T >::end ( unsigned  row)

Please refer to the documentation of std::vector and skepu::Matrix::iterator. Get iterator to last element of row.

Parameters:
rowIndex of row the iterator will point to the last element.
template<typename T >
Matrix< T >::const_iterator skepu::Matrix< T >::end ( unsigned  row) const

Please refer to the documentation of std::vector and skepu::Matrix::iterator. Get iterator to last element of row.

Parameters:
rowIndex of row the iterator will point to the last element.
template<typename T >
void skepu::Matrix< T >::flush ( )

Flushes the matrix, synchronizing it with the device then release all device allocations.

template<typename T >
void skepu::Matrix< T >::flush_CL ( )

Flushes the matrix.

First it updates the matrix from all its device allocations, then it releases all allocations.

template<typename T >
void skepu::Matrix< T >::flush_CU ( )

Flushes the matrix.

First it updates the matrix from all its device allocations, then it releases all allocations.

template<typename T>
T* skepu::Matrix< T >::GetArrayRep ( ) [inline]

Get array representation

template<typename T >
void skepu::Matrix< T >::invalidateDevice ( ) [inline]

Invalidates all device data that this matrix has allocated.

template<typename T>
void skepu::Matrix< T >::load ( const std::string &  filename,
int  rowWidth,
int  numRows = 0 
) [inline]

Loads the Matrix from a file.

Reads a variable number of elements from a file. In the file, all elemets should be in ASCII on one line with whitespace between each element. Mainly for testing purposes.

Parameters:
filenameName of file to save to.
rowWidthThe width of a row. All rows get same amount of width.
numRowsThe number of rows to be loaded. Default value 0 means all rows.

References skepu::Matrix< T >::clear(), skepu::Matrix< T >::invalidateDevice(), and skepu::Matrix< T >::size().

Here is the call graph for this function:

template<typename T>
bool skepu::Matrix< T >::operator!= ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator%= ( const Matrix< T > &  rhs)

Taking Mod with rhs matrix, element wise to current matrix. Two matrices must be of same size.

Parameters:
rhsThe value which is used in taking mod to current matrix.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator%= ( const T &  rhs)

Taking Mod with a scalar value to all elements in the current matrix.

Parameters:
rhsThe value which is used in taking mod to current matrix.
template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator*= ( const Matrix< T > &  rhs)

Multiplies rhs matrix operation element wise to current matrix. Two matrices must be of same size. NB it is not matrix multiplication

Parameters:
rhsThe matrix which is used in multiplication to current matrix.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator*= ( const T &  rhs)

Multiplies a scalar value to all elements in the current matrix.

Parameters:
rhsThe value which is used in multiplication to current matrix.
template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator+= ( const T &  rhs)

Adds a scalar value to all elements in the current matrix.

Parameters:
rhsThe value which is used in addition to current matrix.
template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator+= ( const Matrix< T > &  rhs)

Add rhs matrix operation element wise to current matrix. Two matrices must be of same size.

Parameters:
rhsThe matrix which is used in addition to current matrix.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator-= ( const Matrix< T > &  rhs)

Subtract rhs matrix operation element wise to current matrix. Two matrices must be of same size.

Parameters:
rhsThe matrix which is used in subtraction to current matrix.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator-= ( const T &  rhs)

Subtracts a scalar value to all elements in the current matrix.

Parameters:
rhsThe value which is used in subtraction to current matrix.
template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator/= ( const T &  rhs)

Divides a scalar value to all elements in the current matrix.

Parameters:
rhsThe value which is used in division to current matrix.
template<typename T>
const Matrix< T > & skepu::Matrix< T >::operator/= ( const Matrix< T > &  rhs)

Divides rhs matrix operation element wise to current matrix. Two matrices must be of same size. NB it is not matrix multiplication

Parameters:
rhsThe matrix which is used in division to current matrix.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
bool skepu::Matrix< T >::operator< ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
bool skepu::Matrix< T >::operator<= ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
Matrix< T > & skepu::Matrix< T >::operator= ( Matrix< T > &  other)

copy matrix,,, copy row and column count as well along with data

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
Matrix< T > & skepu::Matrix< T >::operator= ( const T &  elem)

To initialize a matrix with soem scalar value.

Parameters:
elemThe element you want to assign to all matrix.
template<typename T>
bool skepu::Matrix< T >::operator== ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
bool skepu::Matrix< T >::operator> ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
bool skepu::Matrix< T >::operator>= ( const Matrix< T > &  c1)

Please refer to the documentation of std::vector.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
void skepu::Matrix< T >::randomize ( int  min = 0,
int  max = RAND_MAX 
) [inline]

Randomizes the Matrix.

Sets each element of the Matrix to a random number between min and max. The numbers are generated as integers but are cast to the type of the matrix.

Parameters:
minThe smallest number an element can become.
maxThe largest number an element can become.

References skepu::Matrix< T >::invalidateDevice(), skepu::max(), skepu::min(), and skepu::Matrix< T >::size().

Here is the call graph for this function:

template<typename T>
void skepu::Matrix< T >::save ( const std::string &  filename) [inline]

Saves content of Matrix to a file.

Outputs the matrix as text on one line with space between elements to the specified file. Mainly for testing purposes.

Parameters:
filenameName of file to save to.

References skepu::Matrix< T >::updateHost().

Here is the call graph for this function:

template<typename T>
size_type skepu::Matrix< T >::size ( ) const [inline]

Returns total size of Matrix.

Returns:
size of the Matrix.
template<typename T>
Matrix< T > & skepu::Matrix< T >::subsection ( size_type  row,
size_type  col,
size_type  rowWidth,
size_type  colWidth 
)

To get a subsection of matrix. This will creat a separate copy.

Parameters:
rowIndex of row to get.
rowWidthWidth of the row of new Matrix.
colIndex of column to get.
colWidthWidth of column of new Matrix.

References skepu::Matrix< T >::total_cols(), and skepu::Matrix< T >::total_rows().

Here is the call graph for this function:

template<typename T>
void skepu::Matrix< T >::swap ( Matrix< T > &  from)

Please refer to the documentation of std::vector. Updates and invalidate both Matrices before swapping.

References skepu::Matrix< T >::updateHostAndInvalidateDevice().

Here is the call graph for this function:

template<typename T>
size_type skepu::Matrix< T >::total_cols ( ) const [inline]

Returns total number of columns in the Matrix.

Returns:
columns in the Matrix.
template<typename T>
size_type skepu::Matrix< T >::total_rows ( ) const [inline]

Returns total number of rows in the Matrix.

Returns:
rows in the Matrix.
template<typename T>
Matrix< T >::device_pointer_type_cl skepu::Matrix< T >::updateDevice_CL ( T *  start,
size_type  rows,
size_type  cols,
Device_CL device,
bool  copy 
)

Update device with matrix content.

Update device with a Matrix range by specifying rowsize and column size. This allows to create rowwise paritions. If Matrix does not have an allocation on the device for the current range, create a new allocation and if specified, also copy Matrix data to device. Saves newly allocated ranges to m_deviceMemPointers_CL so matrix can keep track of where and what it has stored on devices.

Parameters:
startPointer to first element in range to be updated with device.
rowsNumber of rows.
colsNumber of columns.
devicePointer to the device that should be synched with.
copyBoolean value that tells whether to only allocate or also copy matrix data to device. True copies, False only allocates.

References skepu::DeviceMemPointer_CL< T >::copyHostToDevice(), and skepu::Device_CL::getDeviceID().

Here is the call graph for this function:

template<typename T>
Matrix< T >::device_pointer_type_cu skepu::Matrix< T >::updateDevice_CU ( T *  start,
size_type  cols,
int  deviceID,
bool  copy 
)

Update device with matrix content.

Update device with a Matrix range by specifying rowsize only as number of rows is assumed to be 1 in this case. Helper function, useful for scenarios where matrix need to be treated like Vector 1D. If Matrix does not have an allocation on the device for the current range, create a new allocation and if specified, also copy Matrix data to device. Saves newly allocated ranges to m_deviceMemPointers_CU so matrix can keep track of where and what it has stored on devices.

Parameters:
startPointer to first element in range to be updated with device.
colsNumber of columns.
deviceIDInteger specififying the device that should be synched with.
copyBoolean value that tells whether to only allocate or also copy matrix data to device. True copies, False only allocates.
template<typename T>
Matrix< T >::device_pointer_type_cu skepu::Matrix< T >::updateDevice_CU ( T *  start,
size_type  rows,
size_type  cols,
int  deviceID,
bool  copy,
bool  usePitch = false 
)

Update device with matrix content.

Update device with a Matrix range by specifying rowsize and column size. This allows to create rowwise paritions. If Matrix does not have an allocation on the device for the current range, create a new allocation and if specified, also copy Matrix data to device. Saves newly allocated ranges to m_deviceMemPointers_CU so matrix can keep track of where and what it has stored on devices.

Parameters:
startPointer to first element in range to be updated with device.
rowsNumber of rows.
colsNumber of columns.
deviceIDInteger specififying the device that should be synched with.
copyBoolean value that tells whether to only allocate or also copy matrix data to device. True copies, False only allocates.
usePitchTo allow 2D CUDA memory allocation which can result in padding inserted to make coalescing work.

References skepu::DeviceMemPointer_CU< T >::copyHostToDevice(), and skepu::Environment< T >::getInstance().

Here is the call graph for this function:

template<typename T >
void skepu::Matrix< T >::updateHost ( ) const [inline]

Updates the matrix from its device allocations.

template<typename T >
void skepu::Matrix< T >::updateHostAndInvalidateDevice ( ) [inline]

First updates the matrix from its device allocations. Then invalidates the data allocated on devices.


Friends And Related Function Documentation

template<typename T>
std::ostream& operator<< ( std::ostream &  os,
Matrix< T > &  matrix 
) [friend]

Overloaded stream operator, for testing purposes.

Outputs the matrix rowwise having one row on each line.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Enumerations Friends Defines