MPI: Получение количества узлов (не процессов) в коммуникаторе
-
25-10-2019 - |
Вопрос
Я работаю с программами MPI на суперкомпьютере SMP. Я хотел бы определить, какие процессы разделяют один и тот же узел, например, установив целочисленный ключ, который равен во всех процессах на одном узле, и отличается от узла к другому. Целью будет то, чтобы использовать этот ключ для разделения коммуникатора и попросить подкоммуникаторах собирать только процессы в том же узле.
Так что функция будет выглядеть как
int identify_node(MPI_Comm* comm); // returns a key characterizing a node
Предполагая простое распределение процессов, таких как 0,1,2,3 на Node_1, 4,5,6,7 на Node_2 и т. Д. Это вопрос простой формулы, но я хотел бы достичь того же результата без предположения на распределение.
У меня есть идея, как это сделать, используя mpi_get_processor_name: вычисляя хэш имени и предполагая Будьте трудно отслеживать проблему) или использовать какой -то алгоритм соглашения между процессами (какой? Я еще не знаю).
Как бы вы это сделали (эффективно, если это возможно)?
Маттие
Решение
Вы правы, что предположение о распределении было бы неразумно, поскольку переупорядочение ранга на самом деле является перспективной техникой для повышения производительности за счет этой регулярности.
Хороший алгоритм хеширования на возвратной стоимости MPI_Get_processor_name
Должно быть в безопасности, но если вы хотите дважды проверить, вы всегда можете собрать настоящие имена в каждой группе, используя MPI_Gatherv
и сравните их напрямую.
Кажется этот вопрос решает те же проблемы.