00001 #ifndef PARALLEL_BATCH_H
00002 #define PARALLEL_BATCH_H
00003
00004 #include "parallel_common.h"
00005
00006 namespace parallel_ode
00007 {
00008
00009 namespace BatchTypes
00010 {
00012 enum BatchType { BATCH_RANDOM,
00013 BATCH_GREEDY,
00014 BATCH_COLORED,
00015 DEFAULT_BATCH_TYPE = BATCH_RANDOM };
00016 }
00017 typedef BatchTypes::BatchType BatchType;
00018
00020
00025 class BatchStrategy
00026 {
00027 public:
00028
00029 typedef IntVector BatchVector;
00030
00036 BatchStrategy( int maxBatches = ParallelOptions::MAXBATCHES )
00037 : maxBatches_( maxBatches ),
00038 bAlign_( false ),
00039 alignment_( ParallelOptions::DEFAULTALIGN ) {
00040
00041 }
00042
00046 virtual ~BatchStrategy( ) { }
00047
00063 virtual int batch( const int* pairList, const int numConstraints, const int numBodies,
00064 BatchVector& constraintIndices,
00065 BatchVector& bodyRepetitionCount0,
00066 BatchVector& bodyRepetitionCount1,
00067 BatchVector& maxBodyRepetitionCountInBatch,
00068 BatchVector& batchIndices,
00069 BatchVector& batchSizes );
00070
00071 inline int getMaxBatches() const { return maxBatches_; }
00072 inline void setMaxBatches( int maxBatches ) { maxBatches_ = maxBatches_; }
00073
00074 inline bool isAligning() const { return bAlign_; }
00075 inline void setAlign( bool bAlign ) { bAlign_ = bAlign; }
00076
00077 inline int getAlignment() const { return alignment_; }
00078 inline void setAlignment( int alignment ) { alignment_ = alignment; }
00079
00080 protected:
00081
00087 int baseBatch( const int* pairList,
00088 const BatchVector& constraintIndices,
00089 const BatchVector& batchSizes,
00090 BatchVector& batchIndices,
00091 BatchVector& bodyRepetitionCount0,
00092 BatchVector& bodyRepetitionCount1,
00093 BatchVector& maxBodyRepetitionCountInBatch );
00094
00100 int batchRepetitionCount( const int* pairList,
00101 const BatchVector& constraintIndices,
00102 const BatchVector& batchIndices,
00103 BatchVector& bodyRepetitionCount0,
00104 BatchVector& bodyRepetitionCount1,
00105 BatchVector& maxBodyRepetitionCountInBatch );
00106
00115 static void batchIndicesFromBatchSizes( const BatchVector& batchSizes, BatchVector& batchIndices, bool bAlign, int alignment );
00116
00117 private:
00118
00119 int maxBatches_;
00120 bool bAlign_;
00121 int alignment_;
00122 };
00123
00125
00126
00130 class GreedyBatchStrategy : public BatchStrategy
00131 {
00132
00133 public:
00134
00140 GreedyBatchStrategy( int maxBatches = ParallelOptions::MAXBATCHES ) : BatchStrategy( maxBatches ) { }
00141
00146 virtual int batch( const int* pairList, const int numPairs, const int numBodies,
00147 BatchVector& bodyRepetitionCount0,
00148 BatchVector& bodyRepetitionCount1,
00149 BatchVector& maxBodyRepetitionCountInBatch,
00150 BatchVector& constraintIndices,
00151 BatchVector& batchIndices,
00152 BatchVector& batchSizes );
00153
00154 };
00155
00157
00158
00162 class ColoringBatchStrategy : public BatchStrategy
00163 {
00164
00165 public:
00166
00172 ColoringBatchStrategy( int maxBatches = ParallelOptions::MAXBATCHES ) : BatchStrategy( maxBatches ) { }
00173
00177 virtual int batch( const int* pairList, const int numPairs, const int numBodies,
00178 BatchVector& bodyRepetitionCount0,
00179 BatchVector& bodyRepetitionCount1,
00180 BatchVector& maxBodyRepetitionCountInBatch,
00181 BatchVector& constraintIndices,
00182 BatchVector& batchIndices,
00183 BatchVector& batchSizes );
00184
00185 };
00186
00188
00192 class BatchStrategyFactory
00193 {
00194 public:
00195
00206 static BatchStrategy* create( BatchType batchType, int numBatches, bool bAlign = false, int alignment = ParallelOptions::DEFAULTALIGN )
00207 {
00208 BatchStrategy* newStrategy = NULL;
00209 switch(batchType)
00210 {
00211 case BatchTypes::BATCH_RANDOM:
00212 newStrategy = new BatchStrategy( numBatches );
00213 break;
00214 case BatchTypes::BATCH_GREEDY:
00215 newStrategy = new GreedyBatchStrategy( numBatches );
00216 break;
00217 case BatchTypes::BATCH_COLORED:
00218 default:
00219 newStrategy = new ColoringBatchStrategy( numBatches );
00220 break;
00221 }
00222 newStrategy->setAlign( bAlign );
00223 newStrategy->setAlignment( alignment );
00224 return newStrategy;
00225 }
00226 };
00227
00228 }
00229
00230 #endif