Связь между рядами процессов после использования MPI_COMM_split
Я использовал MPI_Comm_split, чтобы разделить коммуникатор MPI по умолчанию. Если изначально в коммуникаторе по умолчанию было 10 процессов,MPI_COMM_WORLD и, скажем, их ранги были определены id_original. Новый коммуникатор состоял из 4 процессов с id_original 6,7,8,9. Эти процессы будут иметь ранги, определенные, скажем, id_new в новом коммуникаторе. Какова будет связь между рядами процессов в этих двух коммуникаторах. Будут ли процессы с id_original 6,7,8,9 иметь новые ранги 0,1,2,3 соответственно в новом коммуникаторе или порядок будет другим?
2 ответа
Вы должны использовать аргумент "ключ" для MPI_Comm_split, чтобы контролировать порядок в новом коммуникаторе. Например, вы можете использовать ранг в MPI_Comm_world (или ваш "id_original") в качестве ключа, например так:
MPI_Comm_split( MPI_COMM_WORLD, id_original >= 6 && id_original <= 9,
id_original, &newComm );
Согласно этому (выделено мной):
Внутри каждой подгруппы процессы ранжируются в порядке, определяемом значением ключа аргумента, причем связи прерываются в соответствии с их рангом в старой группе.
Так что да, если процессы 6-9 предоставляют одинаковое значение для key
затем они получат оценки 0-3 в новом коммуникаторе соответственно. Если это имеет решающее значение для правильности программы, тогда вы должны сделать это в своем коде явным, используя метод Эдрика.