00001 #include <stdio.h> 00002 #include <string.h> 00003 #include <stdlib.h> 00004 #include "charm++.h" 00005 #include "barrier.h" 00006 #include "barrier.def.h" 00007 00008 Barrier::Barrier(void) 00009 { 00010 myPe = CkMyPe(); 00011 myLeft = (myPe*2)+1; 00012 myRight = myLeft+1; 00013 myParent = (myPe % 2 == 0) ? ((myPe-2)/2) : ((myPe-1)/2); 00014 myGroup = thisgroup; 00015 kidscount = 0; 00016 if (myRight >= CkNumPes()) 00017 kidscount++; 00018 if (myLeft >= CkNumPes()) 00019 kidscount++; 00020 } 00021 00022 void Barrier::reset(void) 00023 { 00024 kidscount = 0; 00025 if (myRight >= CkNumPes()) 00026 kidscount++; 00027 if (myLeft >= CkNumPes()) 00028 kidscount++; 00029 } 00030 00031 void Barrier::atBarrier(FP *m) 00032 { 00033 CProxy_Barrier grp(myGroup); 00034 00035 kidscount++; 00036 if (kidscount == 3) { 00037 if (myPe == 0) 00038 grp[CkMyPe()].callFP(); 00039 else 00040 grp[myParent].notify(); 00041 } 00042 fnptr = m->fp; 00043 delete m; 00044 } 00045 00046 void Barrier::notify(void) 00047 { 00048 CProxy_Barrier grp(myGroup); 00049 00050 kidscount++; 00051 if (kidscount == 3) { 00052 if (myPe == 0) 00053 grp[CkMyPe()].callFP(); 00054 else 00055 grp[myParent].notify(); 00056 } 00057 } 00058 00059 void Barrier::callFP(void) 00060 { 00061 CProxy_Barrier grp(myGroup); 00062 00063 if (myLeft < CkNumPes()) 00064 grp[myLeft].callFP(); 00065 if (myRight < CkNumPes()) 00066 grp[myRight].callFP(); 00067 fnptr(); 00068 } 00069 00070 CkGroupID barrierInit(void) 00071 { 00072 return CProxy_Barrier::ckNew(); 00073 } 00074