Исходный текст реализации функции MPIX_Cart_comm_create():
http://dcmf.anl-external.org/docs/mpi:dcmfd/mpix_8c_source.html
1. Получить "физические" координаты процесса в трехмерном торе
2. На их основе вычислить будущий ранк процесса во вновь создаваемом декартовом коммуникаторе
3. Создать вспомогательный коммуникатор, в котором каждый процесс будет иметь вычисленный в пункте 2 ранк
4. Из вспомогательного коммуникатора создать декартов коммуникатор, отражающий "физические" размеры тора, запретив перенумерацию процессов.
Комментарии
1.
Для получения "физических" координат процесса и прочих "физических" характеристик применяется функция DCMF_Hardware().
2.
Так как нам нужно создать не просто виртуальную топологию, а такую виртуальную топологию, которая отражает "железо", на котором работает программа, требуется, чтобы "физические" координаты и прочие "физические" характеристики (размерность, замкнутость) совпадали со своими виртуальными аналогами.
В соответствии с документацией по MPI, в декартовом коммуникаторе процессы нумеруются "по строкам", т.е. последний индекс меняется быстрее всех. С учетом этого и порядка размерностей вычисляется будущий ранк процесса. В текущей версии будущий ранк будет таким, как если бы при запуске программы применялось размещение типа XYZT.
3.
Для перенумерации процессов из коммуникатора MPI_COMM_WORLD применяется функция MPI_Comm_split() с одним-единственным цветом.
4.
На основе этого нового коммуникатора и "физических" характеристик с помощью MPI_Cart_create() и создается требуемый декартов коммуникатор, отражающий архитектуру. Функции MPI_Cart_create() запрещается перенумеровывать процессы, поэтому "виртуальные" декартовы координаты процесса будут совпадать с "физическими".