00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef BL_DISTRIBUTIONMAPPING_H
00024 #define BL_DISTRIBUTIONMAPPING_H
00025
00026
00027
00028 #include <vector>
00029
00030 #include <BoxLib.H>
00031 #include <Array.H>
00032 #include <Box.H>
00033
00034 class BoxArray;
00035
00036
00037
00039
00052 class DistributionMapping
00053 {
00054 public:
00055
00057
00058 enum Strategy { ROUNDROBIN, KNAPSACK };
00059
00061
00062 DistributionMapping ();
00063
00065
00066 DistributionMapping (const BoxArray& boxes, int nprocs);
00067
00068
00069
00070
00071 DistributionMapping (const DistributionMapping& d1,
00072 const DistributionMapping& d2);
00073
00074 DistributionMapping (const BoxArray& boxes,int nprocs,
00075 int* procmapping);
00076
00078
00079 ~DistributionMapping ();
00080
00085 void define (const BoxArray& boxes, int nprocs);
00086
00092 const Array<int>& ProcessorMap () const;
00093
00095
00096 int operator[] (int index) const;
00097
00099
00100 static void strategy (Strategy how);
00101
00103
00104 static Strategy strategy ();
00105
00110 static void FlushCache ();
00111
00113
00114 static int CacheSize ();
00115
00117
00118 static void AddToCache (const DistributionMapping& dm);
00119
00121
00122 static void CacheStats (std::ostream& os);
00123
00125
00126 bool operator== (const DistributionMapping& rhs) const;
00127
00129
00130 bool operator!= (const DistributionMapping& rhs) const;
00131
00132 void RoundRobinProcessorMap (int nboxes, int nprocs);
00133 void KnapSackProcessorMap (const std::vector<long>& boxes, int nprocs);
00134
00135
00136
00137
00138
00139
00140
00141
00142 static void Initialize ();
00143
00144 static void Finalize ();
00145
00146 private:
00147
00148
00149
00150 void RoundRobinProcessorMap (const BoxArray& boxes, int nprocs);
00151 void KnapSackProcessorMap (const BoxArray& boxes, int nprocs);
00152
00153
00154
00155
00156 static std::vector< Array<int> > m_Cache;
00157
00158
00159
00160 bool GetMap (const BoxArray& boxes);
00161
00162
00163
00164 typedef void (DistributionMapping::*PVMF)(const BoxArray&,int);
00165
00166
00167
00168 static Strategy m_Strategy;
00169
00170
00171
00172
00173 static PVMF m_BuildMap;
00174
00175
00176
00177 static bool m_Initialized;
00178
00179
00180
00181
00182
00183
00184
00185
00186 Array<int> m_procmap;
00187 };
00188
00189
00190
00191
00192 std::ostream& operator<< (std::ostream& os, const DistributionMapping& pmap);
00193
00194 #endif