nouveau fichier : src/PerfArrayTreeBuilder.cpp
This commit is contained in:
parent
caa6e85da2
commit
f1198076d8
108
src/PerfArrayTreeBuilder.cpp
Normal file
108
src/PerfArrayTreeBuilder.cpp
Normal file
@ -0,0 +1,108 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm> // std::sort
|
||||
|
||||
#include "triskeleDebug.hpp"
|
||||
#include "triskeleBase.hpp"
|
||||
#include "Tree.hpp"
|
||||
#include "TreeStats.hpp"
|
||||
#include "TreeBuilder.hpp"
|
||||
#include "IImage.hpp"
|
||||
#include "AttributeProfiles.hpp"
|
||||
#include "ArrayTree/triskeleArrayTreeBase.hpp"
|
||||
#include "ArrayTree/triskeleSort.hpp"
|
||||
#include "ArrayTree/Border.hpp"
|
||||
#include "ArrayTree/GraphWalker.hpp"
|
||||
#include "ArrayTree/Leader.hpp"
|
||||
#include "ArrayTree/Weight.hpp"
|
||||
#include "ArrayTree/ArrayTreeBuilder.hpp"
|
||||
#include "Attributes/WeightAttributes.hpp"
|
||||
|
||||
using namespace otb::triskele;
|
||||
using namespace otb::triskele::arrayTree;
|
||||
|
||||
|
||||
typedef uint16_t PixelT;
|
||||
typedef uint16_t WeightT;
|
||||
|
||||
// ========================================
|
||||
void
|
||||
perf (const Raster<PixelT> &raster, const GraphWalker &graphWalker, const TreeType &treeType, const unsigned int &coreCount) {
|
||||
ArrayTreeBuilder<PixelT, WeightT> atb (raster, graphWalker, treeType);
|
||||
Tree tree (coreCount);
|
||||
WeightAttributes<PixelT> weightAttributes (tree);
|
||||
atb.buildTree (tree, weightAttributes);
|
||||
tree.check ();
|
||||
}
|
||||
|
||||
// ========================================
|
||||
int
|
||||
main (int argc, char **argv, char **envp) {
|
||||
if (argc != 5) {
|
||||
cerr << "Usage: " << argv[0] << ": treeType coreCount nbTest imageSize" << endl;
|
||||
exit (1);
|
||||
}
|
||||
string argType (argv[1]);
|
||||
TreeType treeType = MIN;
|
||||
if (argType == "MIN")
|
||||
treeType = MIN;
|
||||
else if (argType == "MAX")
|
||||
treeType = MAX;
|
||||
else if (argType == "TOS")
|
||||
treeType= TOS;
|
||||
else if (argType == "ALPHA")
|
||||
treeType = ALPHA;
|
||||
else {
|
||||
cerr << "unknown type: " << argType << endl;
|
||||
exit (1);
|
||||
}
|
||||
const size_t maxCoreCount (atol (argv[2])+1);
|
||||
const size_t nbTest (atol (argv[3]));
|
||||
const size_t maxImageSize (atol (argv[4]));
|
||||
|
||||
const size_t forbiden = size_t (nbTest*.1);
|
||||
const size_t stepImg = max (size_t (1), size_t (maxImageSize*.1));
|
||||
|
||||
srand (time (NULL));
|
||||
|
||||
for (size_t card = stepImg; card < maxImageSize; card += stepImg) {
|
||||
const size_t h = size_t (sqrt (card*1.1)*2/30)*10;
|
||||
const size_t w = card/h;
|
||||
Size size (w, h);
|
||||
Border border (size, false);
|
||||
GraphWalker graphWalker (size, border);
|
||||
int leafCount = graphWalker.vertexMaxCount ();
|
||||
Raster<PixelT> raster (size);
|
||||
|
||||
cout << endl
|
||||
<< "card:" << card << "(" << w << "x" << h << "=" << (w*h) << ") argType:" << argType << " coreCount:" << maxCoreCount << " nbTest:" << nbTest << "(-" << (2*forbiden) << ")"<< endl
|
||||
<< "========================================" << flush;
|
||||
vector<vector<double>> times (maxCoreCount);
|
||||
for (unsigned int coreCount = 1; coreCount < maxCoreCount ; ++coreCount)
|
||||
times[coreCount].reserve (nbTest);
|
||||
|
||||
for (unsigned int test = 0; test < nbTest ; ++test) {
|
||||
if (!(test%50))
|
||||
cout << endl;
|
||||
for (int p = 0; p < leafCount; ++p)
|
||||
raster.getPixels ()[p] = (PixelT) std::rand ();
|
||||
cout << "." << flush;
|
||||
for (unsigned int coreCount = 1; coreCount < maxCoreCount ; ++coreCount) {
|
||||
globalTreeStats.reset ();
|
||||
perf (raster, graphWalker, treeType, coreCount);
|
||||
times[coreCount].push_back (ba::mean (globalTreeStats.getTimeStats (buildTreeStats)));
|
||||
}
|
||||
}
|
||||
cout << endl;
|
||||
for (unsigned int coreCount = 1; coreCount < maxCoreCount ; ++coreCount) {
|
||||
vector<double> &tab (times[coreCount]);
|
||||
sort (tab.begin (), tab.end ());
|
||||
double average = accumulate (tab.begin ()+forbiden, tab.end ()-forbiden, .0) / nbTest;
|
||||
cout << "card:" << card << " treeType:" << argType << " coreCount:" << coreCount << " average: " << average << " throughput:" << size_t (card/average) << endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ========================================
|
||||
Loading…
Reference in New Issue
Block a user