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 и сравнить их напрямую.

Кажется, этот вопрос касается тех же проблем.

Другие вопросы по тегам