5669179febcd2e8e25d3f01c70d2908e189a7cb2
[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
31         (int nelements, CkArrayIndexMax *elements, int src_pe);
32     
33  public:
34     
35     //Array constructor
36     MultiRingMulticast(CkArrayID dest_id, int flag = 0);    
37     MultiRingMulticast(CkMigrateMessage *m) : DirectMulticastStrategy(m){}
38
39     //Destructor
40     ~MultiRingMulticast() {}
41     
42     void pup(PUP::er &p);
43     void beginProcessing(int nelements);
44     
45     PUPable_decl(MultiRingMulticast);
46 };
47
48 #endif
49