MPI: получение количества узлов (не процессов) в коммуникаторе
Я работаю с программами 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: вычисляя хеш имени и предполагая, что никакие два имени не получат одинаковый хеш (мне это не нравится, потому что если однажды у меня будет два имени с одинаковым хешем, это будет трудно отследить проблему), или использовать какой-то алгоритм согласования между процессами (какой? Я пока не знаю).
Как бы вы это сделали (эффективно, если это возможно)?
Матье
1 ответ
Вы правы в том, что предположение о распределении было бы неразумным, поскольку переупорядочение рангов на самом деле является перспективной техникой для повышения производительности за счет этой регулярности.
Хороший алгоритм хеширования на возвращаемое значение MPI_Get_processor_name
должно быть довольно безопасно, но если вы хотите перепроверить, вы всегда можете собрать фактические имена в каждой группе, используя MPI_Gatherv
и сравнить их напрямую.
Кажется, этот вопрос касается тех же проблем.