Как отобразить процесс на Гиперкуб с помощью MPI_CART
Я пытаюсь реализовать битоническую сортировку с использованием MPI для 2^n процессоров.
Я хотел бы использовать n-мерный гиперкуб для этого. Используя MPI_Cart_Create, я могу создавать самоорганизующиеся измерения. Это увеличит эффективность моего процесса, а также сократит количество LOC, которые я должен выплюнуть, чтобы это сделать..
Поиск в Google И литература всегда говорят одно и то же:
Заметим, что n-мерный гиперкуб является n-мерным тором с двумя процессами в направлении координат. Таким образом, специальная поддержка гиперкубических структур не требуется.
Я не видел ни одного примера + n-мерного тора с двумя процессами на одно направление координат для меня не что иное, как загадка. Кто-нибудь должен предложить?
Спасибо,
1 ответ
Ну нашел
так что это было бы для 4-го гиперкуба.. Шаблон довольно прост. В n-мерном гиперкубе каждая точка имеет N соседей, и они представлены в этом коде. Обратите внимание, что этот код следует использовать вместо битовой маски ксоринга, поскольку MPI может переупорядочивать процессы в соответствии с физическим расположением ваших кластеров.
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";