From f1198076d852266158445797111ce2f500485f85 Mon Sep 17 00:00:00 2001 From: Git Merciol Date: Wed, 14 Mar 2018 14:29:03 +0100 Subject: [PATCH] =?UTF-8?q?=09nouveau=20fichier=C2=A0:=20src/PerfArrayTree?= =?UTF-8?q?Builder.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PerfArrayTreeBuilder.cpp | 108 +++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/PerfArrayTreeBuilder.cpp diff --git a/src/PerfArrayTreeBuilder.cpp b/src/PerfArrayTreeBuilder.cpp new file mode 100644 index 0000000..223845a --- /dev/null +++ b/src/PerfArrayTreeBuilder.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include // 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 &raster, const GraphWalker &graphWalker, const TreeType &treeType, const unsigned int &coreCount) { + ArrayTreeBuilder atb (raster, graphWalker, treeType); + Tree tree (coreCount); + WeightAttributes 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 raster (size); + + cout << endl + << "card:" << card << "(" << w << "x" << h << "=" << (w*h) << ") argType:" << argType << " coreCount:" << maxCoreCount << " nbTest:" << nbTest << "(-" << (2*forbiden) << ")"<< endl + << "========================================" << flush; + vector> 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 &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; +} + +// ========================================