9670279e6cf1c1dff50075bbd33ce274fb47806a
[charm.git] / src / ck-com / MultiRingMulticast.h
1 #ifndef MULTIRING_MULTICAST_STRATEGY
2 #define MULTIRING_MULTICAST_STRATEGY
3
4 #include "DirectMulticastStrategy.h"
5
6 /***************************************************************
7               Section multicast strategy that sends data along a ring 
8               with multiple start points on the ring
9
10       Sameer - 04/19/05
11 *************************************************************/
12
13 /**
14  * Multicast strategy that sends the data using two rings. It divides the total
15  * number of processors involved in the multicast in two (after ordering them).
16  * Then two rings are created, one starting with the source processor and its
17  * half, the other starting at (CkMyPe()+CkNumPes()/2)%CkNumPes().
18  */
19 class MultiRingMulticast: public DirectMulticastStrategy {
20     
21  protected:
22     
23     int isEndOfRing(int next_pe, int src_pe);
24     
25     ///Defines the two entries of the section multicast interface
26     virtual ComlibSectionHashObject *createObjectOnSrcPe(int nelements, 
27                                                          CkArrayIndexMax *elements);
28
29     ///Creates the propagation across the half ring
30     virtual ComlibSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndexMax *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe);
31     
32  public:
33     
34     //Array constructor
35     MultiRingMulticast(CkArrayID dest_id, int flag = 0);    
36     MultiRingMulticast(CkMigrateMessage *m) : DirectMulticastStrategy(m){}
37
38     //Destructor
39     ~MultiRingMulticast() {}
40     
41     void pup(PUP::er &p);
42     void beginProcessing(int nelements);
43     
44     PUPable_decl(MultiRingMulticast);
45 };
46
47 #endif
48