88#include < ctime>
99#include < chrono>
1010#include < functional>
11+ #include < omp.h>
1112
1213// Own includes
1314#include " map/include/map_parameters.hpp"
2324
2425int main (int argc, char ** argv)
2526{
27+ /*
28+ * Make sure env variable MALLOC_ARENA_MAX is unset
29+ * for efficient multi-threaded execution
30+ */
31+ unsetenv ((char *)" MALLOC_ARENA_MAX" );
32+
2633 CommandLineProcessing::ArgvParser cmd;
2734 using namespace std ::placeholders; // for _1, _2, _3...
2835
@@ -34,60 +41,72 @@ int main(int argc, char** argv)
3441
3542 skch::parseandSave (argc, argv, cmd, parameters);
3643
37- // Redirect Mashmap's mapping output to null fs, using file name for CGI output
3844 std::string fileName = parameters.outFileName ;
3945
40- #ifdef DEBUG
41- parameters.outFileName = parameters.outFileName + " .map" ;
42- #else
46+ // To redirect Mashmap's mapping output to null fs, using file name for CGI output
4347 parameters.outFileName = " /dev/null" ;
44- #endif
45-
46- auto t0 = skch::Time::now ();
47-
48- // Build the sketch for reference
49- skch::Sketch referSketch (parameters);
50-
51- std::chrono::duration<double > timeRefSketch = skch::Time::now () - t0;
52- std::cerr << " INFO, skch::main, Time spent sketching the reference : " << timeRefSketch.count () << " sec" << std::endl;
5348
54- // Initialize the files to delete the existing content
55- {
56- #ifdef DEBUG
57- std::ofstream outstrm2 (fileName + " .map.1way" );
58- std::ofstream outstrm3 (fileName + " .map.2way" );
59- #endif
60- if (parameters.visualize )
61- std::ofstream outstrm4 (fileName + " .visual" );
62- }
49+ // Set up for parallel execution
50+ omp_set_num_threads ( parameters.threads );
51+ std::vector <skch::Parameters> parameters_split (parameters.threads );
52+ cgi::splitReferenceGenomes (parameters, parameters_split);
6353
6454 // Final output vector of ANI computation
6555 std::vector<cgi::CGI_Results> finalResults;
6656
67- // Loop over query genomes
68- for (uint64_t queryno = 0 ; queryno < parameters.querySequences . size (); queryno ++)
57+ # pragma omp parallel for
58+ for (uint64_t i = 0 ; i < parameters.threads ; i ++)
6959 {
70- t0 = skch::Time::now ();
60+ // start timer
61+ auto t0 = skch::Time::now ();
62+
63+ // Build the sketch for reference
64+ skch::Sketch referSketch (parameters_split[i]);
65+
66+ std::chrono::duration<double > timeRefSketch = skch::Time::now () - t0;
67+
68+ if ( omp_get_thread_num () == 0 )
69+ std::cerr << " INFO [thread 0], skch::main, Time spent sketching the reference : " << timeRefSketch.count () << " sec" << std::endl;
70+
71+ // Final output vector of ANI computation
72+ std::vector<cgi::CGI_Results> finalResults_local;
73+
74+ // Loop over query genomes
75+ for (uint64_t queryno = 0 ; queryno < parameters_split[i].querySequences .size (); queryno++)
76+ {
77+ t0 = skch::Time::now ();
78+
79+ skch::MappingResultsVector_t mapResults;
80+ uint64_t totalQueryFragments = 0 ;
81+
82+ auto fn = std::bind (skch::Map::insertL2ResultsToVec, std::ref (mapResults), _1);
83+ skch::Map mapper = skch::Map (parameters_split[i], referSketch, totalQueryFragments, queryno, fn);
84+
85+ std::chrono::duration<double > timeMapQuery = skch::Time::now () - t0;
86+
87+ if ( omp_get_thread_num () == 0 )
88+ std::cerr << " INFO [thread 0], skch::main, Time spent mapping fragments in query #" << queryno + 1 << " : " << timeMapQuery.count () << " sec" << std::endl;
7189
72- skch::MappingResultsVector_t mapResults;
73- uint64_t totalQueryFragments = 0 ;
90+ t0 = skch::Time::now ();
7491
75- auto fn = std::bind (skch::Map::insertL2ResultsToVec, std::ref (mapResults), _1);
76- skch::Map mapper = skch::Map (parameters, referSketch, totalQueryFragments, queryno, fn);
92+ cgi::computeCGI (parameters_split[i], mapResults, mapper, referSketch, totalQueryFragments, queryno, fileName, finalResults_local);
7793
78- std::chrono::duration<double > timeMapQuery = skch::Time::now () - t0;
79- std::cerr << " INFO, skch::main, Time spent mapping fragments in query #" << queryno + 1 << " : " << timeMapQuery.count () << " sec" << std::endl;
94+ std::chrono::duration<double > timeCGI = skch::Time::now () - t0;
8095
81- t0 = skch::Time::now ();
96+ if ( omp_get_thread_num () == 0 )
97+ std::cerr << " INFO [thread 0], skch::main, Time spent post mapping : " << timeCGI.count () << " sec" << std::endl;
98+ }
8299
83- cgi::computeCGI (parameters, mapResults, mapper, referSketch, totalQueryFragments, queryno, fileName, finalResults );
100+ cgi::correctRefGenomeIds (finalResults_local );
84101
85- std::chrono::duration< double > timeCGI = skch::Time::now () - t0;
86- std::cerr << " INFO, skch::main, Time spent post mapping : " << timeCGI. count () << " sec " << std::endl ;
102+ # pragma omp critical
103+ finalResults. insert (finalResults. end (), finalResults_local. begin (), finalResults_local. end ()) ;
87104 }
88105
106+ // report output in file
89107 cgi::outputCGI (parameters, finalResults, fileName);
90108
109+ // report output as matrix
91110 if (parameters.matrixOutput )
92111 cgi::outputPhylip (parameters, finalResults, fileName);
93112}
0 commit comments