Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

SelectWorkLoadInPlace.h

Go to the documentation of this file.
00001 #ifndef Impala_Util_Mpi_SelectWorkLoadInPlace_h
00002 #define Impala_Util_Mpi_SelectWorkLoadInPlace_h
00003 
00004 #include "Util/StlHelpers.h"
00005 
00006 namespace Impala
00007 {
00008 namespace Util
00009 {
00010 namespace Mpi
00011 {
00012 
00021 template<class collectionT>
00022 void SelectWorkLoadInPlace(collectionT* collection)
00023 {
00024     ILOG_VAR(Util.Mpi.SelectWorkLoad);
00025     int numProcs = Link::Mpi::NrProcs();
00026     // MvL: I copied the name lastConcept from existing code, but the name is
00027     // misleading: it is the first index *after* the vector.
00028     int lastConcept = collection->size();
00029     int taskSize = lastConcept / numProcs;
00030     int restSize = lastConcept % numProcs;
00031     int curConcept = 0;
00032     int start;
00033     int number;
00034     for (int i=0 ; i<numProcs ; i++)
00035     {
00036         start = curConcept;
00037         number = taskSize;
00038         if (--restSize >= 0)
00039             number++;
00040         /* this test was in original code, it can never succeed (I think) 
00041            because taskSize * numProc + restSize = lastConcept. Apart form that
00042            the body of the origin test was wrong
00043         if (start + number > lastConcept) 
00044             number = lastConcept - start;
00045         */
00046         curConcept += number;
00047         if (i == Link::Mpi::MyId())
00048             break;
00049     }
00050     if (start >= lastConcept)
00051     {
00052         // MvL: I think this test can never succeed.
00053         ILOG_WARNING_NODE("more nodes than concepts: nothing to do");
00054         start = 0;
00055         number = 0;
00056     }
00057     Util::SubSelectInPlace(collection, start, number);
00058 }
00059 /* original code from mainTrainModel
00060 {
00061     int numProcs = Link::Mpi::NrProcs();
00062     if (numberConcepts == -1)
00063         numberConcepts = conceptList.size();
00064     if (startConcept + numberConcepts >= conceptList.size())
00065         numberConcepts = conceptList.size() - startConcept;
00066     int lastConcept = startConcept + numberConcepts;
00067     int taskSize = numberConcepts / numProcs;
00068     int restSize = numberConcepts % numProcs;
00069     int curConcept = startConcept;
00070     int start;
00071     int number;
00072     for (int i=0 ; i<numProcs ; i++)
00073     {
00074         start = curConcept;
00075         number = taskSize;
00076         if (--restSize >= 0)
00077             number++;
00078         if (start + number > lastConcept)
00079             number = lastConcept - startConcept;
00080         curConcept += number;
00081         if (i == Link::Mpi::MyId())
00082             break;
00083     }
00084     if (start >= lastConcept)
00085     {
00086         //ILOG_ERROR("start concept out of range");
00087         Link::Mpi::Finalize();
00088         return 1;
00089     }
00090 }
00091 */
00092 
00093 }//namespace Mpi
00094 }//namespace Util
00095 }//namespace Impala
00096 
00097 #endif Impala_Util_Mpi_JobManager_h

Generated on Fri Mar 19 09:31:47 2010 for ImpalaSrc by  doxygen 1.5.1