fixed a bug in MultiRing where the sorting of the data was causing problems.
[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     ///Specifies that the multicast messages need the processor list to be ordered
33     virtual int needSorting() { return 1; }
34     
35  public:
36     
37     //Array constructor
38     MultiRingMulticast(CkArrayID dest_id, int flag = 0);    
39     MultiRingMulticast(CkMigrateMessage *m) : DirectMulticastStrategy(m){}
40
41     //Destructor
42     ~MultiRingMulticast() {}
43     
44     void pup(PUP::er &p);
45     void beginProcessing(int nelements);
46     
47     PUPable_decl(MultiRingMulticast);
48 };
49
50 #endif
51