5 #ifndef SPARSE_MATRIX_H
6 #define SPARSE_MATRIX_H
23 #include "skepu/src/malloc_allocator.h"
41 RUTHERFOR_BOEING_FORMAT
67 unsigned int *m_colInd;
68 unsigned int *m_rowPtr;
79 unsigned int *m_colPtrCSC;
80 unsigned int *m_rowIndCSC;
81 bool m_transposeValid;
92 void deleteCSCFormat()
98 m_transposeValid =
false;
100 if(m_colPtrCSC!=NULL)
105 if(m_rowIndCSC!=NULL)
110 if(m_valuesCSC!=NULL)
116 if(m_cscMatrix!=NULL)
123 void convertToCSCFormat()
127 std::cerr<<
"Cannot apply transpose operation on a matrix which is already in CSC format.\n";
131 if(m_transposeValid && (m_valuesCSC!=NULL) && (m_rowIndCSC!=NULL) && (m_colPtrCSC!=NULL))
136 if(m_valuesCSC==NULL)
137 m_valuesCSC =
new T[m_nnz];
138 if(m_rowIndCSC == NULL)
139 m_rowIndCSC =
new unsigned int[m_nnz];
140 if( m_colPtrCSC == NULL)
141 m_colPtrCSC =
new unsigned int[m_cols+1];
146 std::multimap<unsigned int, std::pair<unsigned int, T>, std::less<unsigned int> > cscFormat;
148 for(
int ii = 0; ii < m_rows; ii++)
150 rowIdx = m_rowPtr[ii];
151 nxtRowIdx = m_rowPtr[ii+1];
153 for(
int jj=rowIdx; jj<nxtRowIdx; jj++)
155 cscFormat.insert( std::make_pair(m_colInd[jj], std::make_pair(ii, m_values[jj])) );
160 typedef typename std::multimap<unsigned int, std::pair<unsigned int, T>, std::less<unsigned int> >
::iterator mapIter;
167 unsigned int expColInd = 0;
169 for (m_it = cscFormat.begin(); m_it != cscFormat.end(); m_it = s_it)
171 unsigned int colInd = (*m_it).first;
173 if(expColInd < colInd)
175 for(
int i=expColInd; i<colInd; i++)
177 m_colPtrCSC[++col] = ind;
180 expColInd = colInd+1;
182 std::pair<mapIter, mapIter> keyRange = cscFormat.equal_range(colInd);
185 for (s_it = keyRange.first; s_it != keyRange.second; ++s_it)
187 m_rowIndCSC[ind] = (*s_it).second.first;
188 m_valuesCSC[ind] = (*s_it).second.second;
191 m_colPtrCSC[++col] = ind;
193 for(
int i= (col+1); i<=m_cols; i++)
195 m_colPtrCSC[i] = ind;
198 m_transposeValid =
true;
202 void readMTXFile(
const std::string &inputfile);
206 void printMatrixInDenseFormat()
208 std::cerr<<
"SparseMatrix ("<<m_rows <<
" X "<< m_cols<<
") nnz: "<<m_nnz<<
"\n";
210 T *temp =
new T[m_cols];
212 int rowIdx, nxtRowIdx;
213 for(
int ii = 0; ii < m_rows; ii++)
215 for(
int i=0; i<m_cols; i++)
218 rowIdx = m_rowPtr[ii];
219 nxtRowIdx = m_rowPtr[ii+1];
221 for(
int jj=rowIdx; jj<nxtRowIdx; jj++)
223 temp[m_colInd[jj]] = m_values[jj];
225 for(
int i=0; i<m_cols; i++)
226 std::cerr<<std::setw(5)<<temp[i];
237 convertToCSCFormat();
239 if(m_cscMatrix==NULL)
241 m_cscMatrix =
new SparseMatrix(m_cols, m_rows, m_nnz, m_valuesCSC, m_colPtrCSC, m_rowIndCSC,
false, T(),
true);
248 SparseMatrix(
unsigned int rows,
unsigned int cols,
unsigned int nnz, T *values,
unsigned int *rowPtr,
unsigned int *colInd,
bool dealloc=
true, T zeroValue=T(),
bool transMatrix=
false);
250 SparseMatrix(
unsigned int rows,
unsigned int cols,
unsigned int nnz, T min, T max, T zeroValue=T());
266 friend std::ostream& operator<<(std::ostream &os, SparseMatrix<T>& matrix)
268 matrix.acquireRead();
270 os<<
"Matrix rows="<< matrix.total_rows() <<
", cols="<<matrix.total_cols()<<
", nnz="<<matrix.total_nnz()<<
"\n";
275 for(
int ii = 0; ii < matrix.total_rows(); ii++)
277 rowIdx = matrix.m_rowPtr[ii];
278 nxtRowIdx = matrix.m_rowPtr[ii+1];
280 for(
int jj=rowIdx; jj<nxtRowIdx; jj++)
282 os<<
"row: "<<std::setw(8)<<ii<<
", col: "<<std::setw(8)<<matrix.m_colInd[jj]<<
", value"<<std::setw(12)<<matrix.m_values[jj]<<
"\n";
317 unsigned int* get_row_pointers()
const {
return m_rowPtr; }
319 unsigned int* get_col_indices()
const {
return m_colInd; }
321 int get_rowSize(
unsigned int row)
const
323 return (m_rowPtr[row+1]-m_rowPtr[row]);
326 int get_rowOffsetFromStart(
unsigned int row)
const
329 return m_rowPtr[row];
335 iterator
begin(
unsigned row);
338 T
at(
unsigned int row,
unsigned int col )
const;
339 const T&
at(
unsigned int index)
const;
342 const T& at_internal(
unsigned int row,
unsigned int col )
const;
343 T& at_internal(
unsigned int row,
unsigned int col );
344 const T& at_internal(
unsigned int index)
const;
347 const T&
operator()(
const unsigned int row,
const unsigned int col)
const;
348 T
operator()(
const unsigned int row,
const unsigned int col);
351 void resize(SparseMatrix<T> ©,
bool retainData);
353 void updateHost()
const;
354 void invalidateDevice();
355 void updateHostAndInvalidateDevice();
363 void unpartitionMatrix()
const
365 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX UNPARTIOTIINING parts: "<< parts <<
" *****\n")
368 starpu_data_unpartition(csr_matrix_handle, 0);
376 void release_acquire()
382 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX RELEASE **** parts: "<< parts <<
"\n")
385 assert (parts == starpu_data_get_nb_children(csr_matrix_handle));
386 for (
int x = 0; x < parts; x++)
388 starpu_data_release(starpu_data_get_sub_data(csr_matrix_handle, 1, x));
393 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX RELEASE ****\n")
394 starpu_data_release(csr_matrix_handle);
403 starpu_data_handle_t csr_matrix_handle;
404 mutable
bool isOnStarPU;
405 mutable
bool isReadBack;
406 mutable
bool isWriteBack;
409 mutable
bool isAcquire;
410 mutable enum starpu_data_access_mode mode;
412 struct starpu_data_filter csr_matrix_filter;
424 starpu_csr_data_register(&csr_matrix_handle,0, m_nnz, m_rows, (uintptr_t)m_values, (uint32_t *)m_colInd, (uint32_t *)m_rowPtr, 0,
sizeof(m_values[0]));
426 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX REGISTERING **** rows: "<< m_rows <<
" cols: "<< m_cols <<
" \n")
432 return csr_matrix_handle;
450 starpu_data_unregister(csr_matrix_handle);
453 starpu_data_unregister_no_coherency(csr_matrix_handle);
469 starpu_csr_data_register(&csr_matrix_handle,0, m_nnz, m_rows, (uintptr_t)m_values, (uint32_t *)m_colInd, (uint32_t *)m_rowPtr, 0,
sizeof(m_values[0]));
471 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX REGISTERING **** "<< m_nnz <<
"\n")
476 return csr_matrix_handle;
480 starpu_data_unpartition(csr_matrix_handle, 0);
481 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX UNPARTITIONING **** parts: "<< parts <<
"\n")
486 csr_matrix_filter.nchildren = _parts;
487 starpu_data_partition(csr_matrix_handle, &csr_matrix_filter);
491 DEBUG_TEXT_LEVEL1(
"***** SPARSE MATRIX PARTITIONING **** parts: "<< _parts <<
"\n")
494 return csr_matrix_handle;
Contains the definitions of the SparseMatrix::iterator class.
void acquireReadWrite()
Ensure that data is available for reading and writing purpose on CPU First updates the SparseMatrix f...
Definition: sparse_matrix.inl:679
void resize(SparseMatrix< T > ©, bool retainData)
Definition: sparse_matrix.inl:457
Defines a few macros that can be used to output text when debugging. The macros use std::cerr...
starpu_data_handle_t registerPartitions(int _parts=1)
To register Matrix to StarPU. This method can create partitions of the matrix.
Definition: sparse_matrix.h:463
SparseMatrix(unsigned int rows, unsigned int cols, unsigned int nnz, T *values, unsigned int *rowPtr, unsigned int *colInd, bool dealloc=true, T zeroValue=T(), bool transMatrix=false)
Definition: sparse_matrix.inl:65
unsigned int total_rows() const
Definition: sparse_matrix.h:303
A sparse matrix container class that mainly stores its data in CSR format.
Definition: sparse_matrix.h:62
~SparseMatrix()
Definition: sparse_matrix.inl:264
void unregisterSparseMatrix(bool update=true)
Definition: sparse_matrix.h:438
void acquireRead() const
Ensure that SparseMatrix data is most updated for reading purpose on CPU.
Definition: sparse_matrix.inl:646
iterator begin(unsigned row)
Definition: sparse_matrix.inl:367
unsigned int total_cols() const
Definition: sparse_matrix.h:309
unsigned int total_nnz() const
Definition: sparse_matrix.h:297
An sparse matrix iterator class that tranverses row-wise.
Definition: sparse_matrix_iterator.inl:20
T at(unsigned int row, unsigned int col) const
Definition: sparse_matrix.inl:314
T * get_values()
Definition: sparse_matrix.h:315
starpu_data_handle_t registerSparseMatrix()
To register SparseMatrix with StarPU. Does not create partitions of Matrix.
Definition: sparse_matrix.h:418
SparseFileFormat
Can be used to specify the input format for a sparse matrix that is supplied in constructor.
Definition: sparse_matrix.h:37
Contains the definitions of member functions of the SparseMatrix class that are not related to any ba...
const T & operator()(const unsigned int row, const unsigned int col) const
Definition: sparse_matrix.inl:389