update timing to use internal timing.h api

release/4.3a0
acxz 2020-05-09 21:29:08 -04:00
parent b4eb0c233d
commit 93b4081c7f
6 changed files with 214 additions and 59 deletions

View File

@ -24,7 +24,6 @@
#include <gtsam/discrete/DecisionTree-inl.h> // for convert only #include <gtsam/discrete/DecisionTree-inl.h> // for convert only
#define DISABLE_TIMING #define DISABLE_TIMING
#include <boost/timer.hpp>
#include <boost/tokenizer.hpp> #include <boost/tokenizer.hpp>
#include <boost/assign/std/map.hpp> #include <boost/assign/std/map.hpp>
#include <boost/assign/std/vector.hpp> #include <boost/assign/std/vector.hpp>
@ -32,6 +31,7 @@ using namespace boost::assign;
#include <CppUnitLite/TestHarness.h> #include <CppUnitLite/TestHarness.h>
#include <gtsam/discrete/Signature.h> #include <gtsam/discrete/Signature.h>
#include <gtsam/base/timing.h>
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
@ -75,16 +75,15 @@ void dot(const T&f, const string& filename) {
// instrumented operators // instrumented operators
/* ******************************************************************************** */ /* ******************************************************************************** */
size_t muls = 0, adds = 0; size_t muls = 0, adds = 0;
boost::timer timer; double elapsed;
void resetCounts() { void resetCounts() {
muls = 0; muls = 0;
adds = 0; adds = 0;
timer.restart();
} }
void printCounts(const string& s) { void printCounts(const string& s) {
#ifndef DISABLE_TIMING #ifndef DISABLE_TIMING
cout << boost::format("%s: %3d muls, %3d adds, %g ms.") % s % muls % adds cout << boost::format("%s: %3d muls, %3d adds, %g ms.") % s % muls % adds
% (1000 * timer.elapsed()) << endl; % (1000 * elapsed) << endl;
#endif #endif
resetCounts(); resetCounts();
} }
@ -148,6 +147,7 @@ TEST(ADT, joint)
DiscreteKey A(0, 2), S(1, 2), T(2, 2), L(3, 2), B(4, 2), E(5, 2), X(6, 2), D(7, 2); DiscreteKey A(0, 2), S(1, 2), T(2, 2), L(3, 2), B(4, 2), E(5, 2), X(6, 2), D(7, 2);
resetCounts(); resetCounts();
gttic_(asiaCPTs);
ADT pA = create(A % "99/1"); ADT pA = create(A % "99/1");
ADT pS = create(S % "50/50"); ADT pS = create(S % "50/50");
ADT pT = create(T | A = "99/1 95/5"); ADT pT = create(T | A = "99/1 95/5");
@ -156,10 +156,15 @@ TEST(ADT, joint)
ADT pE = create((E | T, L) = "F T T T"); ADT pE = create((E | T, L) = "F T T T");
ADT pX = create(X | E = "95/5 2/98"); ADT pX = create(X | E = "95/5 2/98");
ADT pD = create((D | E, B) = "9/1 2/8 3/7 1/9"); ADT pD = create((D | E, B) = "9/1 2/8 3/7 1/9");
gttoc_(asiaCPTs);
tictoc_getNode(asiaCPTsNode, asiaCPTs);
elapsed = asiaCPTsNode->secs();
tictoc_reset_();
printCounts("Asia CPTs"); printCounts("Asia CPTs");
// Create joint // Create joint
resetCounts(); resetCounts();
gttic_(asiaJoint);
ADT joint = pA; ADT joint = pA;
dot(joint, "Asia-A"); dot(joint, "Asia-A");
joint = apply(joint, pS, &mul); joint = apply(joint, pS, &mul);
@ -177,6 +182,10 @@ TEST(ADT, joint)
joint = apply(joint, pD, &mul); joint = apply(joint, pD, &mul);
dot(joint, "Asia-ASTLBEXD"); dot(joint, "Asia-ASTLBEXD");
EXPECT_LONGS_EQUAL(346, (long)muls); EXPECT_LONGS_EQUAL(346, (long)muls);
gttoc_(asiaJoint);
tictoc_getNode(asiaJointNode, asiaJoint);
elapsed = asiaJointNode->secs();
tictoc_reset_();
printCounts("Asia joint"); printCounts("Asia joint");
ADT pASTL = pA; ADT pASTL = pA;
@ -199,6 +208,7 @@ TEST(ADT, inference)
B(2,2), L(3,2), E(4,2), S(5,2), T(6,2), X(7,2); B(2,2), L(3,2), E(4,2), S(5,2), T(6,2), X(7,2);
resetCounts(); resetCounts();
gttic_(infCPTs);
ADT pA = create(A % "99/1"); ADT pA = create(A % "99/1");
ADT pS = create(S % "50/50"); ADT pS = create(S % "50/50");
ADT pT = create(T | A = "99/1 95/5"); ADT pT = create(T | A = "99/1 95/5");
@ -207,10 +217,15 @@ TEST(ADT, inference)
ADT pE = create((E | T, L) = "F T T T"); ADT pE = create((E | T, L) = "F T T T");
ADT pX = create(X | E = "95/5 2/98"); ADT pX = create(X | E = "95/5 2/98");
ADT pD = create((D | E, B) = "9/1 2/8 3/7 1/9"); ADT pD = create((D | E, B) = "9/1 2/8 3/7 1/9");
gttoc_(infCPTs);
tictoc_getNode(infCPTsNode, infCPTs);
elapsed = infCPTsNode->secs();
tictoc_reset_();
// printCounts("Inference CPTs"); // printCounts("Inference CPTs");
// Create joint // Create joint
resetCounts(); resetCounts();
gttic_(asiaProd);
ADT joint = pA; ADT joint = pA;
dot(joint, "Joint-Product-A"); dot(joint, "Joint-Product-A");
joint = apply(joint, pS, &mul); joint = apply(joint, pS, &mul);
@ -228,8 +243,14 @@ TEST(ADT, inference)
joint = apply(joint, pD, &mul); joint = apply(joint, pD, &mul);
dot(joint, "Joint-Product-ASTLBEXD"); dot(joint, "Joint-Product-ASTLBEXD");
EXPECT_LONGS_EQUAL(370, (long)muls); // different ordering EXPECT_LONGS_EQUAL(370, (long)muls); // different ordering
gttoc_(asiaProd);
tictoc_getNode(asiaProdNode, asiaProd);
elapsed = asiaProdNode->secs();
tictoc_reset_();
printCounts("Asia product"); printCounts("Asia product");
resetCounts();
gttic_(asiaSum);
ADT marginal = joint; ADT marginal = joint;
marginal = marginal.combine(X, &add_); marginal = marginal.combine(X, &add_);
dot(marginal, "Joint-Sum-ADBLEST"); dot(marginal, "Joint-Sum-ADBLEST");
@ -240,6 +261,10 @@ TEST(ADT, inference)
marginal = marginal.combine(E, &add_); marginal = marginal.combine(E, &add_);
dot(marginal, "Joint-Sum-ADBL"); dot(marginal, "Joint-Sum-ADBL");
EXPECT_LONGS_EQUAL(161, (long)adds); EXPECT_LONGS_EQUAL(161, (long)adds);
gttoc_(asiaSum);
tictoc_getNode(asiaSumNode, asiaSum);
elapsed = asiaSumNode->secs();
tictoc_reset_();
printCounts("Asia sum"); printCounts("Asia sum");
} }
@ -249,6 +274,7 @@ TEST(ADT, factor_graph)
DiscreteKey B(0,2), L(1,2), E(2,2), S(3,2), T(4,2), X(5,2); DiscreteKey B(0,2), L(1,2), E(2,2), S(3,2), T(4,2), X(5,2);
resetCounts(); resetCounts();
gttic_(createCPTs);
ADT pS = create(S % "50/50"); ADT pS = create(S % "50/50");
ADT pT = create(T % "95/5"); ADT pT = create(T % "95/5");
ADT pL = create(L | S = "99/1 90/10"); ADT pL = create(L | S = "99/1 90/10");
@ -256,10 +282,15 @@ TEST(ADT, factor_graph)
ADT pX = create(X | E = "95/5 2/98"); ADT pX = create(X | E = "95/5 2/98");
ADT pD = create(B | E = "1/8 7/9"); ADT pD = create(B | E = "1/8 7/9");
ADT pB = create(B | S = "70/30 40/60"); ADT pB = create(B | S = "70/30 40/60");
gttoc_(createCPTs);
tictoc_getNode(createCPTsNode, createCPTs);
elapsed = createCPTsNode->secs();
tictoc_reset_();
// printCounts("Create CPTs"); // printCounts("Create CPTs");
// Create joint // Create joint
resetCounts(); resetCounts();
gttic_(asiaFG);
ADT fg = pS; ADT fg = pS;
fg = apply(fg, pT, &mul); fg = apply(fg, pT, &mul);
fg = apply(fg, pL, &mul); fg = apply(fg, pL, &mul);
@ -269,8 +300,14 @@ TEST(ADT, factor_graph)
fg = apply(fg, pD, &mul); fg = apply(fg, pD, &mul);
dot(fg, "FactorGraph"); dot(fg, "FactorGraph");
EXPECT_LONGS_EQUAL(158, (long)muls); EXPECT_LONGS_EQUAL(158, (long)muls);
gttoc_(asiaFG);
tictoc_getNode(asiaFGNode, asiaFG);
elapsed = asiaFGNode->secs();
tictoc_reset_();
printCounts("Asia FG"); printCounts("Asia FG");
resetCounts();
gttic_(marg);
fg = fg.combine(X, &add_); fg = fg.combine(X, &add_);
dot(fg, "Marginalized-6X"); dot(fg, "Marginalized-6X");
fg = fg.combine(T, &add_); fg = fg.combine(T, &add_);
@ -282,49 +319,83 @@ TEST(ADT, factor_graph)
fg = fg.combine(L, &add_); fg = fg.combine(L, &add_);
dot(fg, "Marginalized-2L"); dot(fg, "Marginalized-2L");
EXPECT(adds = 54); EXPECT(adds = 54);
gttoc_(marg);
tictoc_getNode(margNode, marg);
elapsed = margNode->secs();
tictoc_reset_();
printCounts("marginalize"); printCounts("marginalize");
// BLESTX // BLESTX
// Eliminate X // Eliminate X
resetCounts();
gttic_(elimX);
ADT fE = pX; ADT fE = pX;
dot(fE, "Eliminate-01-fEX"); dot(fE, "Eliminate-01-fEX");
fE = fE.combine(X, &add_); fE = fE.combine(X, &add_);
dot(fE, "Eliminate-02-fE"); dot(fE, "Eliminate-02-fE");
gttoc_(elimX);
tictoc_getNode(elimXNode, elimX);
elapsed = elimXNode->secs();
tictoc_reset_();
printCounts("Eliminate X"); printCounts("Eliminate X");
// Eliminate T // Eliminate T
resetCounts();
gttic_(elimT);
ADT fLE = pT; ADT fLE = pT;
fLE = apply(fLE, pE, &mul); fLE = apply(fLE, pE, &mul);
dot(fLE, "Eliminate-03-fLET"); dot(fLE, "Eliminate-03-fLET");
fLE = fLE.combine(T, &add_); fLE = fLE.combine(T, &add_);
dot(fLE, "Eliminate-04-fLE"); dot(fLE, "Eliminate-04-fLE");
gttoc_(elimT);
tictoc_getNode(elimTNode, elimT);
elapsed = elimTNode->secs();
tictoc_reset_();
printCounts("Eliminate T"); printCounts("Eliminate T");
// Eliminate S // Eliminate S
resetCounts();
gttic_(elimS);
ADT fBL = pS; ADT fBL = pS;
fBL = apply(fBL, pL, &mul); fBL = apply(fBL, pL, &mul);
fBL = apply(fBL, pB, &mul); fBL = apply(fBL, pB, &mul);
dot(fBL, "Eliminate-05-fBLS"); dot(fBL, "Eliminate-05-fBLS");
fBL = fBL.combine(S, &add_); fBL = fBL.combine(S, &add_);
dot(fBL, "Eliminate-06-fBL"); dot(fBL, "Eliminate-06-fBL");
gttoc_(elimS);
tictoc_getNode(elimSNode, elimS);
elapsed = elimSNode->secs();
tictoc_reset_();
printCounts("Eliminate S"); printCounts("Eliminate S");
// Eliminate E // Eliminate E
resetCounts();
gttic_(elimE);
ADT fBL2 = fE; ADT fBL2 = fE;
fBL2 = apply(fBL2, fLE, &mul); fBL2 = apply(fBL2, fLE, &mul);
fBL2 = apply(fBL2, pD, &mul); fBL2 = apply(fBL2, pD, &mul);
dot(fBL2, "Eliminate-07-fBLE"); dot(fBL2, "Eliminate-07-fBLE");
fBL2 = fBL2.combine(E, &add_); fBL2 = fBL2.combine(E, &add_);
dot(fBL2, "Eliminate-08-fBL2"); dot(fBL2, "Eliminate-08-fBL2");
gttoc_(elimE);
tictoc_getNode(elimENode, elimE);
elapsed = elimENode->secs();
tictoc_reset_();
printCounts("Eliminate E"); printCounts("Eliminate E");
// Eliminate L // Eliminate L
resetCounts();
gttic_(elimL);
ADT fB = fBL; ADT fB = fBL;
fB = apply(fB, fBL2, &mul); fB = apply(fB, fBL2, &mul);
dot(fB, "Eliminate-09-fBL"); dot(fB, "Eliminate-09-fBL");
fB = fB.combine(L, &add_); fB = fB.combine(L, &add_);
dot(fB, "Eliminate-10-fB"); dot(fB, "Eliminate-10-fB");
gttoc_(elimL);
tictoc_getNode(elimLNode, elimL);
elapsed = elimLNode->secs();
tictoc_reset_();
printCounts("Eliminate L"); printCounts("Eliminate L");
} }

View File

@ -17,7 +17,6 @@
* @date Jan 30, 2012 * @date Jan 30, 2012
*/ */
#include <boost/timer.hpp>
#include <boost/assign/std/vector.hpp> #include <boost/assign/std/vector.hpp>
using namespace boost::assign; using namespace boost::assign;

View File

@ -15,7 +15,8 @@
#include <vector> #include <vector>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <boost/shared_array.hpp> #include <boost/shared_array.hpp>
#include <boost/timer.hpp>
#include <gtsam/base/timing.h>
#include "FindSeparator.h" #include "FindSeparator.h"

View File

@ -16,11 +16,11 @@
* @date Oct 26, 2013 * @date Oct 26, 2013
*/ */
#include <gtsam/base/timing.h>
#include <gtsam/base/DSFVector.h> #include <gtsam/base/DSFVector.h>
#include <gtsam_unstable/base/DSF.h> #include <gtsam_unstable/base/DSF.h>
#include <gtsam/base/DSFMap.h> #include <gtsam/base/DSFMap.h>
#include <boost/timer.hpp>
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/assign/std/vector.hpp> #include <boost/assign/std/vector.hpp>
@ -33,7 +33,6 @@
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
using namespace boost::assign; using namespace boost::assign;
using boost::timer;
using boost::format; using boost::format;
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
@ -61,7 +60,7 @@ int main(int argc, char* argv[]) {
cout << "Generating " << nm << " matches" << endl; cout << "Generating " << nm << " matches" << endl;
std::mt19937 rng; std::mt19937 rng;
std::uniform_int_distribution<> rn(0, N - 1); std::uniform_int_distribution<> rn(0, N - 1);
typedef pair<size_t, size_t> Match; typedef pair<size_t, size_t> Match;
vector<Match> matches; vector<Match> matches;
matches.reserve(nm); matches.reserve(nm);
@ -72,46 +71,66 @@ int main(int argc, char* argv[]) {
{ {
// DSFBase version // DSFBase version
timer tim; double dsftime = 0;
gttic_(dsftime);
DSFBase dsf(N); // Allow for N keys DSFBase dsf(N); // Allow for N keys
for(const Match& m: matches) for(const Match& m: matches)
dsf.merge(m.first, m.second); dsf.merge(m.first, m.second);
os << tim.elapsed() << ","; gttoc_(dsftime);
cout << format("DSFBase: %1% s") % tim.elapsed() << endl; tictoc_getNode(dsftimeNode, dsftime);
dsftime = dsftimeNode->secs();
os << dsftime << ",";
cout << format("DSFBase: %1% s") % dsftime << endl;
tictoc_reset_();
} }
{ {
// DSFMap version // DSFMap version
timer tim; double dsftime = 0;
gttic_(dsftime);
DSFMap<size_t> dsf; DSFMap<size_t> dsf;
for(const Match& m: matches) for(const Match& m: matches)
dsf.merge(m.first, m.second); dsf.merge(m.first, m.second);
os << tim.elapsed() << endl; gttoc_(dsftime);
cout << format("DSFMap: %1% s") % tim.elapsed() << endl; tictoc_getNode(dsftimeNode, dsftime);
dsftime = dsftimeNode->secs();
os << dsftime << endl;
cout << format("DSFMap: %1% s") % dsftime << endl;
tictoc_reset_();
} }
if (false) { if (false) {
// DSF version, functional // DSF version, functional
timer tim; double dsftime = 0;
gttic_(dsftime);
DSF<size_t> dsf; DSF<size_t> dsf;
for (size_t j = 0; j < N; j++) for (size_t j = 0; j < N; j++)
dsf = dsf.makeSet(j); dsf = dsf.makeSet(j);
for(const Match& m: matches) for(const Match& m: matches)
dsf = dsf.makeUnion(m.first, m.second); dsf = dsf.makeUnion(m.first, m.second);
os << tim.elapsed() << endl; gttoc_(dsftime);
cout << format("DSF functional: %1% s") % tim.elapsed() << endl; tictoc_getNode(dsftimeNode, dsftime);
dsftime = dsftimeNode->secs();
os << dsftime << endl;
cout << format("DSF functional: %1% s") % dsftime << endl;
tictoc_reset_();
} }
if (false) { if (false) {
// DSF version, in place - always slower - use functional ! // DSF version, in place - always slower - use functional !
timer tim; double dsftime = 0;
gttic_(dsftime);
DSF<size_t> dsf; DSF<size_t> dsf;
for (size_t j = 0; j < N; j++) for (size_t j = 0; j < N; j++)
dsf.makeSetInPlace(j); dsf.makeSetInPlace(j);
for(const Match& m: matches) for(const Match& m: matches)
dsf.makeUnionInPlace(m.first, m.second); dsf.makeUnionInPlace(m.first, m.second);
os << tim.elapsed() << ","; gttoc_(dsftime);
cout << format("DSF in-place: %1% s") % tim.elapsed() << endl; tictoc_getNode(dsftimeNode, dsftime);
dsftime = dsftimeNode->secs();
os << dsftime << ",";
cout << format("DSF in-place: %1% s") % dsftime << endl;
tictoc_reset_();
} }
} }

View File

@ -16,7 +16,7 @@
*/ */
#include <iostream> #include <iostream>
#include <boost/timer.hpp> #include <gtsam/base/timing.h>
#include <gtsam/base/Matrix.h> #include <gtsam/base/Matrix.h>
using namespace std; using namespace std;
@ -54,7 +54,7 @@ double timeCollect(size_t p, size_t m, size_t n, bool passDims, size_t reps) {
Matrix result; Matrix result;
double elapsed; double elapsed;
{ {
boost::timer t; gttic_(elapsed);
if (passDims) if (passDims)
for (size_t i=0; i<reps; ++i) for (size_t i=0; i<reps; ++i)
@ -62,7 +62,11 @@ double timeCollect(size_t p, size_t m, size_t n, bool passDims, size_t reps) {
else else
for (size_t i=0; i<reps; ++i) for (size_t i=0; i<reps; ++i)
result = collect(matrices); result = collect(matrices);
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
// delete the matrices // delete the matrices
for (size_t i=0; i<p;++i) { for (size_t i=0; i<p;++i) {
@ -95,10 +99,15 @@ double timeVScaleColumn(size_t m, size_t n, size_t reps) {
double elapsed; double elapsed;
Matrix result; Matrix result;
{ {
boost::timer t; gttic_(elapsed);
for (size_t i=0; i<reps; ++i) for (size_t i=0; i<reps; ++i)
Matrix result = vector_scale(M,V); Matrix result = vector_scale(M,V);
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
return elapsed; return elapsed;
@ -126,10 +135,15 @@ double timeVScaleRow(size_t m, size_t n, size_t reps) {
double elapsed; double elapsed;
Matrix result; Matrix result;
{ {
boost::timer t; gttic_(elapsed);
for (size_t i=0; i<reps; ++i) for (size_t i=0; i<reps; ++i)
result = vector_scale(V,M); result = vector_scale(V,M);
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
return elapsed; return elapsed;
@ -156,12 +170,17 @@ double timeColumn(size_t reps) {
double elapsed; double elapsed;
Vector result; Vector result;
{ {
boost::timer t; gttic_(elapsed);
for (size_t i=0; i<reps; ++i) for (size_t i=0; i<reps; ++i)
for (size_t j = 0; j<n; ++j) for (size_t j = 0; j<n; ++j)
//result = ublas::matrix_column<Matrix>(M, j); //result = ublas::matrix_column<Matrix>(M, j);
result = column(M, j); result = column(M, j);
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
return elapsed; return elapsed;
} }
@ -198,12 +217,17 @@ double timeHouseholder(size_t reps) {
// perform timing // perform timing
double elapsed; double elapsed;
{ {
boost::timer t; gttic_(elapsed);
for (size_t i=0; i<reps; ++i) { for (size_t i=0; i<reps; ++i) {
Matrix A = Abase; Matrix A = Abase;
householder_(A,3); householder_(A,3);
} }
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
return elapsed; return elapsed;
} }
@ -222,13 +246,18 @@ double timeMatrixInsert(size_t reps) {
// perform timing // perform timing
double elapsed; double elapsed;
{ {
boost::timer t; gttic_(elapsed);
Matrix big = bigBase; Matrix big = bigBase;
for (size_t rep=0; rep<reps; ++rep) for (size_t rep=0; rep<reps; ++rep)
for (size_t i=0; i<100; i += 5) for (size_t i=0; i<100; i += 5)
for (size_t j=0; j<100; j += 5) for (size_t j=0; j<100; j += 5)
insertSub(big, small, i,j); insertSub(big, small, i,j);
elapsed = t.elapsed();
gttoc_(elapsed);
tictoc_getNode(elapsedNode, elapsed);
elapsed = elapsedNode->secs();
tictoc_reset_();
} }
return elapsed; return elapsed;
} }

View File

@ -17,10 +17,10 @@
*/ */
#include <boost/random.hpp> #include <boost/random.hpp>
#include <boost/timer.hpp>
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/lambda/lambda.hpp> #include <boost/lambda/lambda.hpp>
#include <gtsam/base/timing.h>
#include <gtsam/base/Matrix.h> #include <gtsam/base/Matrix.h>
#include <iostream> #include <iostream>
@ -30,7 +30,6 @@
using namespace std; using namespace std;
//namespace ublas = boost::numeric::ublas; //namespace ublas = boost::numeric::ublas;
//using namespace Eigen; //using namespace Eigen;
using boost::timer;
using boost::format; using boost::format;
using namespace boost::lambda; using namespace boost::lambda;
@ -68,7 +67,6 @@ int main(int argc, char* argv[]) {
cout << endl; cout << endl;
{ {
timer tim;
double basicTime, fullTime, topTime, blockTime; double basicTime, fullTime, topTime, blockTime;
cout << "Row-major matrix, row-major assignment:" << endl; cout << "Row-major matrix, row-major assignment:" << endl;
@ -79,43 +77,54 @@ int main(int argc, char* argv[]) {
for(size_t j=0; j<(size_t)mat.cols(); ++j) for(size_t j=0; j<(size_t)mat.cols(); ++j)
mat(i,j) = rng(); mat(i,j) = rng();
tim.restart(); gttic_(basicTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t i=0; i<(size_t)mat.rows(); ++i) for(size_t i=0; i<(size_t)mat.rows(); ++i)
for(size_t j=0; j<(size_t)mat.cols(); ++j) for(size_t j=0; j<(size_t)mat.cols(); ++j)
mat(i,j) = rng(); mat(i,j) = rng();
basicTime = tim.elapsed(); gttoc_(basicTime);
tictoc_getNode(basicTimeNode, basicTime);
basicTime = basicTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl; cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl;
tim.restart(); gttic_(fullTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t i=0; i<(size_t)full.rows(); ++i) for(size_t i=0; i<(size_t)full.rows(); ++i)
for(size_t j=0; j<(size_t)full.cols(); ++j) for(size_t j=0; j<(size_t)full.cols(); ++j)
full(i,j) = rng(); full(i,j) = rng();
fullTime = tim.elapsed(); gttoc_(fullTime);
tictoc_getNode(fullTimeNode, fullTime);
fullTime = fullTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl; cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl;
tim.restart(); gttic_(topTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t i=0; i<(size_t)top.rows(); ++i) for(size_t i=0; i<(size_t)top.rows(); ++i)
for(size_t j=0; j<(size_t)top.cols(); ++j) for(size_t j=0; j<(size_t)top.cols(); ++j)
top(i,j) = rng(); top(i,j) = rng();
topTime = tim.elapsed(); gttoc_(topTime);
tictoc_getNode(topTimeNode, topTime);
topTime = topTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl; cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl;
tim.restart(); gttic_(blockTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t i=0; i<(size_t)block.rows(); ++i) for(size_t i=0; i<(size_t)block.rows(); ++i)
for(size_t j=0; j<(size_t)block.cols(); ++j) for(size_t j=0; j<(size_t)block.cols(); ++j)
block(i,j) = rng(); block(i,j) = rng();
blockTime = tim.elapsed(); gttoc_(blockTime);
tictoc_getNode(blockTimeNode, blockTime);
blockTime = blockTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl; cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl;
cout << endl; cout << endl;
} }
{ {
timer tim;
double basicTime, fullTime, topTime, blockTime; double basicTime, fullTime, topTime, blockTime;
cout << "Row-major matrix, column-major assignment:" << endl; cout << "Row-major matrix, column-major assignment:" << endl;
@ -126,43 +135,54 @@ int main(int argc, char* argv[]) {
for(size_t i=0; i<(size_t)mat.rows(); ++i) for(size_t i=0; i<(size_t)mat.rows(); ++i)
mat(i,j) = rng(); mat(i,j) = rng();
tim.restart(); gttic_(basicTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t j=0; j<(size_t)mat.cols(); ++j) for(size_t j=0; j<(size_t)mat.cols(); ++j)
for(size_t i=0; i<(size_t)mat.rows(); ++i) for(size_t i=0; i<(size_t)mat.rows(); ++i)
mat(i,j) = rng(); mat(i,j) = rng();
basicTime = tim.elapsed(); gttoc_(basicTime);
tictoc_getNode(basicTimeNode, basicTime);
basicTime = basicTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl; cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl;
tim.restart(); gttic_(fullTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t j=0; j<(size_t)full.cols(); ++j) for(size_t j=0; j<(size_t)full.cols(); ++j)
for(size_t i=0; i<(size_t)full.rows(); ++i) for(size_t i=0; i<(size_t)full.rows(); ++i)
full(i,j) = rng(); full(i,j) = rng();
fullTime = tim.elapsed(); gttoc_(fullTime);
tictoc_getNode(fullTimeNode, fullTime);
fullTime = fullTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl; cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl;
tim.restart(); gttic_(topTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t j=0; j<(size_t)top.cols(); ++j) for(size_t j=0; j<(size_t)top.cols(); ++j)
for(size_t i=0; i<(size_t)top.rows(); ++i) for(size_t i=0; i<(size_t)top.rows(); ++i)
top(i,j) = rng(); top(i,j) = rng();
topTime = tim.elapsed(); gttoc_(topTime);
tictoc_getNode(topTimeNode, topTime);
topTime = topTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl; cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl;
tim.restart(); gttic_(blockTime);
for(size_t rep=0; rep<nReps; ++rep) for(size_t rep=0; rep<nReps; ++rep)
for(size_t j=0; j<(size_t)block.cols(); ++j) for(size_t j=0; j<(size_t)block.cols(); ++j)
for(size_t i=0; i<(size_t)block.rows(); ++i) for(size_t i=0; i<(size_t)block.rows(); ++i)
block(i,j) = rng(); block(i,j) = rng();
blockTime = tim.elapsed(); gttoc_(blockTime);
tictoc_getNode(blockTimeNode, blockTime);
blockTime = blockTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl; cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl;
cout << endl; cout << endl;
} }
{ {
timer tim;
double basicTime, fullTime, topTime, blockTime; double basicTime, fullTime, topTime, blockTime;
typedef pair<size_t,size_t> ij_t; typedef pair<size_t,size_t> ij_t;
vector<ij_t> ijs(100000); vector<ij_t> ijs(100000);
@ -174,28 +194,44 @@ int main(int argc, char* argv[]) {
for(size_t rep=0; rep<1000; ++rep) for(size_t rep=0; rep<1000; ++rep)
for(const ij_t& ij: ijs) { mat(ij.first, ij.second) = rng(); } for(const ij_t& ij: ijs) { mat(ij.first, ij.second) = rng(); }
gttic_(basicTime);
for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj())); for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj()));
for(size_t rep=0; rep<1000; ++rep) for(size_t rep=0; rep<1000; ++rep)
for(const ij_t& ij: ijs) { mat(ij.first, ij.second) = rng(); } for(const ij_t& ij: ijs) { mat(ij.first, ij.second) = rng(); }
basicTime = tim.elapsed(); gttoc_(basicTime);
tictoc_getNode(basicTimeNode, basicTime);
basicTime = basicTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(ijs.size()*nReps)) << endl; cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(ijs.size()*nReps)) << endl;
gttic_(fullTime);
for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj())); for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj()));
for(size_t rep=0; rep<1000; ++rep) for(size_t rep=0; rep<1000; ++rep)
for(const ij_t& ij: ijs) { full(ij.first, ij.second) = rng(); } for(const ij_t& ij: ijs) { full(ij.first, ij.second) = rng(); }
fullTime = tim.elapsed(); gttoc_(fullTime);
tictoc_getNode(fullTimeNode, fullTime);
fullTime = fullTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(ijs.size()*nReps)) << endl; cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(ijs.size()*nReps)) << endl;
gttic_(topTime);
for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%top.rows(),rnj())); for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%top.rows(),rnj()));
for(size_t rep=0; rep<1000; ++rep) for(size_t rep=0; rep<1000; ++rep)
for(const ij_t& ij: ijs) { top(ij.first, ij.second) = rng(); } for(const ij_t& ij: ijs) { top(ij.first, ij.second) = rng(); }
topTime = tim.elapsed(); gttoc_(topTime);
tictoc_getNode(topTimeNode, topTime);
topTime = topTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(ijs.size()*nReps)) << endl; cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(ijs.size()*nReps)) << endl;
gttic_(blockTime);
for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%block.rows(),rnj()%block.cols())); for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%block.rows(),rnj()%block.cols()));
for(size_t rep=0; rep<1000; ++rep) for(size_t rep=0; rep<1000; ++rep)
for(const ij_t& ij: ijs) { block(ij.first, ij.second) = rng(); } for(const ij_t& ij: ijs) { block(ij.first, ij.second) = rng(); }
blockTime = tim.elapsed(); gttoc_(blockTime);
tictoc_getNode(blockTimeNode, blockTime);
blockTime = blockTimeNode->secs();
gtsam::tictoc_reset_();
cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(ijs.size()*nReps)) << endl; cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(ijs.size()*nReps)) << endl;
cout << endl; cout << endl;