MPI: получение количества узлов (не процессов) в коммуникаторе - PullRequest
6 голосов
/ 29 ноября 2011

Я работаю с программами MPI на суперкомпьютере SMP. Я хотел бы определить, какие процессы совместно используют один и тот же узел, например, установив целочисленный ключ, который одинаков во всех процессах на одном узле и отличается от узла к другому. Тогда цель будет состоять в том, чтобы использовать этот ключ для разделения коммуникатора, чтобы субкоммуникаторы собирали только процессы в одном узле.

Таким образом, функция будет выглядеть как

int identify_node(MPI_Comm* comm); // returns a key characterizing a node

Предполагая простое распределение процессов, таких как 0,1,2,3 для узла_1, 4,5,6,7 для узла_2 и т. Д., Это вопрос простой формулы, но я хотел бы добиться того же результата без предположения о распределении.

У меня есть идея, как это сделать, используя MPI_Get_processor_name: вычисляя хеш имени и предполагая, что никакие два имени не получат одинаковый хеш (мне это не нравится, потому что если однажды у меня будет два имени с одинаковым хешем , будет трудно отследить проблему) или использовать какой-либо алгоритм согласования между процессами (какой? Я пока не знаю).

Как бы вы это сделали (эффективно, если это возможно)?

Матье

1 Ответ

3 голосов
/ 29 ноября 2011

Вы правы в том, что предположение о распределении было бы неразумным, поскольку переупорядочение рангов на самом деле является перспективным методом повышения производительности за счет этой регулярности.

Хороший алгоритм хеширования навозвращаемое значение MPI_Get_processor_name должно быть довольно безопасным, но если вы хотите перепроверить, вы всегда можете собрать фактические имена в каждой группе, используя MPI_Gatherv и сравнить их напрямую.

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

...