Cómo trazar un proceso para utilizar MPI_CART Hypercube
Pregunta
Estoy tratando de poner en práctica la clasificación bitónica usando MPI para 2 ^ n procesadores.
Me gustaría utilizar un n-dimensional hipercubo hacerlo por conveniencia. Usando MPI_Cart_Create puedo crear dimensiones de auto-organización. Si lo hace, maximizar la eficiencia de mi proceso y también reducir el número de LOC tengo que escupir para hacerlo ..
Y buscar en Google la literatura siempre dicen la misma cosa:
Tenga en cuenta que un hipercubo n-dimensional es un torus n -dimensional con 2 procesos por dirección de coordenadas. Por lo tanto, un apoyo especial para hipercubo estructuras no es necesario.
No he visto ningún toro dimensionales ejemplo individual + n con 2 procesos por dirección de coordenadas parece nada más que misterio para mí. ¿A alguien le tiene que sugerir?
Gracias,
Solución
Bueno, lo encontró
por lo que sería para un hipercubo 4-d .. El patrón es bastante sencilla. En hipercubo n-dimensional cada punto tiene N vecino y que están representados en este código. Tenga en cuenta que este código debe utilizar en lugar de máscara XOR poco porque MPI puede volver a ordenar los procesos para adaptarse a la disposición física de los clústeres.
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";