00001
00008 #include "hypercubetopology.h"
00009
00010 inline int neighbor(int pe, int dim)
00011 {
00012 return(pe ^ (1<<dim));
00013 }
00014
00015 inline int maxdim(int n)
00016 {
00017 int maxpes=1, dim=0;
00018
00019 while (maxpes< n) {
00020 maxpes *=2;
00021 dim++;
00022 }
00023 if (maxpes==n) return(dim);
00024 else return(dim-1);
00025 }
00026
00027 inline int adjust(int dim, int pe)
00028 {
00029 int mymax=1<<dim;
00030 if (pe >= mymax) return(neighbor(pe, dim));
00031 else return(pe);
00032 }
00033
00034 HypercubeTopology::HypercubeTopology(int npes, int mype) {
00035
00036 int i = 0;
00037 NumPes = npes;
00038 MyPe = mype;
00039 Dim = maxdim(npes);
00040
00041 next = new int *[Dim];
00042 for (i=0;i<Dim;i++) {
00043 next[i]=new int[NumPes];
00044 for (int j=0;j<NumPes;j++) next[i][j]=-1;
00045 }
00046
00047
00048 penum=new int[NumPes];
00049 int *dp=new int[NumPes];
00050 for (i=0;i<NumPes;i++) {
00051 penum[i]=0;
00052 dp[i]=i;
00053 }
00054
00055 CreateStageTable(NumPes, dp);
00056 delete(dp);
00057 }
00058
00059 void HypercubeTopology::getNeighbors(int &np, int *pelist){
00060 np = Dim;
00061
00062 for(int count = 0; count < Dim; count ++)
00063 pelist[count] = MyPe ^ (1 << (Dim - count - 1));
00064 }
00065
00066 int HypercubeTopology::getNumStages(){
00067 return Dim;
00068 }
00069
00070 int HypercubeTopology::getNumSteps(int stage) {
00071 return 1;
00072 }
00073
00074 void HypercubeTopology::getPesToSend(int step, int stage, int &np,
00075 int *pelist, int &nextpe) {
00076 if(step > 0) {
00077 np = 0;
00078 return;
00079 }
00080
00081 np = penum[Dim - stage - 1];
00082 memcpy(pelist, next[Dim - stage - 1], np *sizeof(int));
00083
00084 nextpe = neighbor(MyPe, Dim - stage - 1);
00085 }
00086
00087 int HypercubeTopology::getNumMessagesExpected(int stage) {
00088 return 1;
00089 }
00090
00091 void HypercubeTopology::CreateStageTable(int numpes, int *destpes)
00092 {
00093 int *dir=new int[numpes];
00094 int nextdim, j, i;
00095 for (i=0;i<numpes;i++) {
00096 dir[i]=MyPe ^ adjust(Dim, destpes[i]);
00097 }
00098
00099 for (nextdim=Dim-1; nextdim>=0; nextdim--) {
00100 int mask=1<<nextdim;
00101 for (i=0;i<numpes;i++) {
00102 if (dir[i] & mask) {
00103 dir[i]=0;
00104 for (j=0;(j<penum[nextdim]) && (destpes[i]!=next[nextdim][j]);j++);
00105 if (destpes[i]==next[nextdim][j]) {
00106
00107 continue;
00108 }
00109 next[nextdim][penum[nextdim]]=destpes[i];
00110 penum[nextdim]+=1;
00111
00112 }
00113 }
00114 }
00115 delete dir;
00116 return;
00117 }