Я новичок в MPI. Если я напишу подобный код на c ++, как система определит, сколько рангов будет иметь программа?
Это не похоже на логику, которой мы придерживаемся в объектно-ориентированном языке: когда вы определяете массив, вы точно знаете размер.
Какой механизм они используют в MPI, чтобы позволить системе решать, сколько ранга и всего размера?
Это гибкий? Определить с помощью механизма? Или просто автоматически генерируется при звонке?
int main(int argc, char *argv[]){
MPI_Init(NULL, NULL);
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 4)
master();
else
slave(rank);
MPI_Finalize();
return 0;}
Вот хорошая ссылка:
И вот учебник:
И вот связанный вопрос
Чтобы ответить на ваш вопрос:
Ранг — это (логический) номер процесса (например, идентификатор потока)
Размер — это общее количество процессов (выделено, параллелизм)
Когда вы используете MPI_Init, посмотрите это: https://www.sharcnet.ca/help/index.php/Getting_Started_with_MPI наблюдать, как установить количество процессов.
mpirun -n 4 ./parhello
Вы можете создать свой массив argv [] с помощью «-n N» и указать размер мира для вызова MPI_init.
Вы также можете установить размер мира с помощью переменных среды,
Заимствование из другого вопроса / ответа:
MPI_Comm_size возвращает размер коммуникатора. В нашем примере
MPI_COMM_WORLD (который построен для нас MPI) включает в себя все
процессы в работе, поэтому этот вызов должен вернуть сумму
процессы, которые были запрошены для работы.MPI_Comm_rank возвращает ранг процесса в коммуникаторе. каждый
процессу внутри коммуникатора присваивается дополнительный ранг
начиная с нуля. Ряды процессов в основном используются для
идентификационные цели при отправке и получении сообщений.
Ранг используется, чтобы отличить процессы друг от друга. У вас может быть «главный» процесс (rank = 0), который отправляет сообщения «ведомым» приложениям с рангом 1-15. Или вы можете использовать другие топологии для разделения рабочих нагрузок.
Других решений пока нет …