MPI Bcast или Scatter для определенных рангов

У меня есть некоторый массив данных. То, что я пытался сделать, это вот так:

Используйте ранг 0 для передачи данных в 50 узлов. Каждый узел имеет 1 mpi процесс на нем с 16 ядрами, доступными для этого процесса. Затем каждый процесс mpi будет вызывать многопроцессорность python. Выполняются некоторые вычисления, затем процесс mpi сохраняет данные, которые были рассчитаны с использованием многопроцессорности. Процесс mpi затем изменяет некоторую переменную и снова запускает многопроцессорную обработку. И т.п.

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

Многопроцессорность не работает так хорошо. Итак, теперь я хочу использовать все MPI.

Как я могу (или это невозможно) использовать массив целых чисел, который ссылается на ранги MPI для bcast или разброса. Например, ряды 1-1000, узел имеет 12 ядер. Поэтому каждый 12-й ранг я хочу показывать данные. Затем на каждом 12-м ранге я хочу, чтобы он рассеял данные до 12-го + 1 до 12 + 12 рангов.

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

    One Solution collect form web for “MPI Bcast или Scatter для определенных рангов”

    Я не знаю достаточно mpi4py, чтобы дать вам образец кода с ним, но вот что может быть решением на C ++. Я уверен, вы можете легко вывести код Python.

    #include <mpi.h> #include <iostream> #include <cstdlib> /// for abs #include <zlib.h> /// for crc32 using namespace std; int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); // get size and rank int rank, size; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); // get the compute node name char name[MPI_MAX_PROCESSOR_NAME]; int len; MPI_Get_processor_name( name, &len ); // get an unique positive int from each node names // using crc32 from zlib (just a possible solution) uLong crc = crc32( 0L, Z_NULL, 0 ); int color = crc32( crc, ( const unsigned char* )name, len ); color = abs( color ); // split the communicator into processes of the same node MPI_Comm nodeComm; MPI_Comm_split( MPI_COMM_WORLD, color, rank, &nodeComm ); // get the rank on the node int nodeRank; MPI_Comm_rank( nodeComm, &nodeRank ); // create comms of processes of the same local ranks MPI_Comm peersComm; MPI_Comm_split( MPI_COMM_WORLD, nodeRank, rank, &peersComm ); // now, masters are all the processes of nodeRank 0 // they can communicate among them with the peersComm // and with their local slaves with the nodeComm int worktoDo = 0; if ( rank == 0 ) worktoDo = 1000; cout << "Initially [" << rank << "] on node " << name << " has " << worktoDo << endl; MPI_Bcast( &worktoDo, 1, MPI_INT, 0, peersComm ); cout << "After first Bcast [" << rank << "] on node " << name << " has " << worktoDo << endl; if ( nodeRank == 0 ) worktoDo += rank; MPI_Bcast( &worktoDo, 1, MPI_INT, 0, nodeComm ); cout << "After second Bcast [" << rank << "] on node " << name << " has " << worktoDo << endl; // cleaning up MPI_Comm_free( &peersComm ); MPI_Comm_free( &nodeComm ); MPI_Finalize(); return 0; } 

    Как вы можете видеть, вы сначала создаете коммуникаторы с процессами на одном узле. Затем вы создаете одноранговые коммуникаторы со всеми процессами одного и того же локального ранга на каждом узле. От вашего основного процесса глобального ранга 0 будут отправляться данные локальным мастерам. И они будут распределять работу над узлом, за который они отвечают.

    Python - лучший язык программирования в мире.