00001
00008 #include "MultiRingMulticast.h"
00009
00010
00011
00012
00013
00014 void MultiRingMulticastStrategy::createObjectOnSrcPe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *pelist) {
00015
00016 obj->npes = 0;
00017 obj->pelist = 0;
00018
00019 if(npes == 0) return;
00020
00021 if(npes < 4) {
00022
00023 obj->npes = npes;
00024 for (int i=0; i<npes; ++i) if (pelist[i].pe == CkMyPe()) obj->npes --;
00025 obj->pelist = new int[obj->npes];
00026 for (int i=0, count=0; i<npes; ++i) {
00027 if (pelist[i].pe != CkMyPe()) {
00028 obj->pelist[count] = pelist[i].pe;
00029 count++;
00030 }
00031 }
00032 return;
00033 }
00034
00035 int myid = -1;
00036 for (int i=0; i<npes; ++i) {
00037 if (pelist[i].pe == CkMyPe()) {
00038 myid = i;
00039 break;
00040 }
00041 }
00042
00043 int breaking = npes/2;
00044
00045
00046
00047 int next_id = myid + 1;
00048
00049 if(myid < breaking) {
00050 if (next_id >= breaking) next_id = 0;
00051 } else {
00052 if (next_id >= npes) next_id = breaking;
00053 }
00054
00055 int mid_id;
00056 if (myid < breaking) {
00057 mid_id = myid + breaking;
00058 if (mid_id < breaking) mid_id = breaking;
00059 } else {
00060 mid_id = myid - breaking;
00061 if (mid_id >= breaking) mid_id = 0;
00062 }
00063
00064
00065 if(pelist[next_id].pe != CkMyPe()) {
00066 obj->pelist = new int[2];
00067 obj->npes = 2;
00068
00069 obj->pelist[0] = pelist[next_id].pe;
00070 obj->pelist[1] = pelist[mid_id].pe;
00071 }
00072 else {
00073 CkAbort("Warning Should not be here !!!!!!!!!\n");
00074 }
00075
00076
00077
00078 return;
00079 }
00080
00081 void MultiRingMulticastStrategy::createObjectOnIntermediatePe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *counts, int srcpe) {
00082
00083 obj->pelist = 0;
00084 obj->npes = 0;
00085
00086 if(npes < 4) return;
00087
00088
00089 int myid = -1;
00090 for (int i=0; i<npes; ++i) {
00091 if (counts[i].pe == CkMyPe()) {
00092 myid = i;
00093 break;
00094 }
00095 }
00096
00097
00098 CkAssert(myid >= 0 && myid < npes);
00099
00100 int breaking = npes/2;
00101 int srcid = 0;
00102 for (int i=0; i<npes; ++i) {
00103 if (counts[i].pe == srcpe) {
00104 srcid = i;
00105 break;
00106 }
00107 }
00108
00109 if (srcid < breaking ^ myid < breaking) {
00110
00111 if (srcid < breaking) {
00112 srcid += breaking;
00113 if (srcid < breaking) srcid = breaking;
00114 } else {
00115 srcid -= breaking;
00116 if (srcid >= breaking) srcid = 0;
00117 }
00118 }
00119
00120
00121
00122
00123 int nextid = myid + 1;
00124
00125 if(myid < breaking) {
00126 if (nextid >= breaking) nextid = 0;
00127 }
00128 else {
00129 if (nextid >= npes) nextid = breaking;
00130 }
00131
00132 if (nextid != srcid) {
00133 obj->pelist = new int[1];
00134 obj->npes = 1;
00135 obj->pelist[0] = counts[nextid].pe;
00136 }
00137
00138 return;
00139 }
00140