Switched Matrix::collect() over to a memcpy, but the results weren't actually an improvement
parent
d2291a38d1
commit
b860f06614
|
@ -505,12 +505,24 @@ Matrix collect(const std::vector<const Matrix *>& matrices, size_t m, size_t n)
|
||||||
dimA2 += M->size2();
|
dimA2 += M->size2();
|
||||||
}
|
}
|
||||||
Matrix A(dimA1, dimA2);
|
Matrix A(dimA1, dimA2);
|
||||||
|
double * Aptr = A.data().begin();
|
||||||
size_t hindex = 0;
|
size_t hindex = 0;
|
||||||
BOOST_FOREACH(const Matrix* M, matrices) {
|
BOOST_FOREACH(const Matrix* M, matrices) {
|
||||||
for(size_t d1 = 0; d1 < M->size1(); d1++)
|
size_t row_len = M->size2();
|
||||||
for(size_t d2 = 0; d2 < M->size2(); d2++)
|
|
||||||
A(d1, d2+hindex) = (*M)(d1, d2);
|
// find the size of the row to copy
|
||||||
hindex += M->size2();
|
size_t row_size = sizeof(double) * row_len;
|
||||||
|
|
||||||
|
// loop over rows
|
||||||
|
for(size_t d1 = 0; d1 < M->size1(); ++d1) { // rows
|
||||||
|
// get a pointer to the start of the row in each matrix
|
||||||
|
double * Arow = Aptr + d1*dimA2 + hindex;
|
||||||
|
double * Mrow = const_cast<double*> (M->data().begin() + d1*row_len);
|
||||||
|
|
||||||
|
// do direct memory copy to move the row over
|
||||||
|
memcpy(Arow, Mrow, row_size);
|
||||||
|
}
|
||||||
|
hindex += row_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return A;
|
return A;
|
||||||
|
|
|
@ -14,8 +14,8 @@ using namespace gtsam;
|
||||||
/*
|
/*
|
||||||
* Results:
|
* Results:
|
||||||
* Alex's Machine:
|
* Alex's Machine:
|
||||||
* - no pass: 0.184 sec
|
* - (1st pass of simple changes) no pass: 0.184 sec , pass: 0.181 sec
|
||||||
* - pass : 0.181 sec
|
* - (1st rev memcpy) no pass: 0.181 sec , pass: 0.180 sec
|
||||||
*/
|
*/
|
||||||
double timeCollect(size_t p, size_t m, size_t n, bool passDims, size_t reps) {
|
double timeCollect(size_t p, size_t m, size_t n, bool passDims, size_t reps) {
|
||||||
// create a large number of matrices
|
// create a large number of matrices
|
||||||
|
|
Loading…
Reference in New Issue