Come-mappare processo a un Hypercube utilizzando MPI_CART
Domanda
Sto cercando di implementare l'ordinamento bitonico usando MPI per i processori 2 ^ n.
Vorrei utilizzare un n-dimensionale ipercubo a farlo per convenienza. Utilizzando MPI_Cart_Create posso creare dimensioni di auto-organizzazione. In questo modo ci permetterà di ottimizzare l'efficienza del mio processo e anche di ridurre il numero di LOC devo sputare per farlo fare ..
Googling E la letteratura dicono sempre la stessa cosa:
Si noti che un ipercubo n-dimensionale è un toro n -dimensionale con 2 processi per coordinare direzione. Così, supporto speciale per ipercubo strutture non è necessaria.
Non ho visto alcun toro -dimensionale solo esempio + n con 2 processi per coordinare la direzione sembra altro che mistero per me. Qualcuno deve suggerire?
Grazie,
Soluzione
Bene, trovato
in modo che sarebbe per un 4-d ipercubo .. Il modello è abbastanza straight-forward. In ipercubo n-dimensionale ciascun punto ha N vicina e sono rappresentati in questo codice. Si noti che questo codice dovrebbe usato al posto di XOR maschera di bit perché MPI può riordinare i processi per adattare il layout fisico dei cluster.
int rank, size; //I am process RANK and we are a total of SIZE
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
myFairShareOfNumber = totalNumber / size;
MPI_Comm nthCube;
int nDim=4;
int processPerDim [4]= {2,2,2,2};
int period [4]= {1,1,1,1};
MPI_Cart_create(MPI_COMM_WORLD, nDim, processPerDim, period, true, &nthCube);
int rankInDim;
MPI_Comm_rank(nthCube, &rankInDim);
int rank_source, rank_desta, rank_destb, rank_destc, rank_destd;
MPI_Cart_shift(nthCube, 0,1,&rank_source, &rank_desta);
MPI_Cart_shift(nthCube, 1,1,&rank_source, &rank_destb);
MPI_Cart_shift(nthCube, 2,1,&rank_source, &rank_destc);
MPI_Cart_shift(nthCube, 3,1,&rank_source, &rank_destd);
cerr << "I am known in the world as " << rankInDim << " my adjacents are -> " << rank_desta << "-" << rank_destb << "-" << rank_destc << "-" << rank_destd <<"\n";