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
00027
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
00041
00042
00043
00044
00045
00046 curConcept += number;
00047 if (i == Link::Mpi::MyId())
00048 break;
00049 }
00050 if (start >= lastConcept)
00051 {
00052
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
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 }
00094 }
00095 }
00096
00097 #endif Impala_Util_Mpi_JobManager_h