2016-02-25 1 views
1

Я хочу получить некоторые узлы с программой MPI и сделать что-то между двумя двумя узлами. Мне интересно, как можно получить узлы (вычислительная машина) с MPI? Любая помощь была бы оценена.получить узлы с программой MPI в C

+0

Возможный дубликат [Как получить количество физической машины в MPI] (http://stackoverflow.com/questions/34115227/how-to-get -the-number-of-physical-machine-in-mpi) – Gilles

+0

Спасибо за комментарий и отправку ссылки. Я отредактировал свой вопрос. – Matrix

ответ

4

Что вы можете сделать, это создать коммуникатор для каждого узла, используя MPI_Comm_split_type() с помощью подсказки MPI_COMM_TYPE_SHARED. А затем, получив ряды процессов на каждом узле и используя их для создания коммуникаторов процессов из одних и тех же локальных рангов.

Оттуда процессы внутри коммуникатора, соответствующие процессам локальных рангов 0, будут находиться на разных узлах. Поэтому вы можете использовать его для любых последующих тестов.

Код будет выглядеть примерно так:

int globalRank, localRank; 
MPI_Comm nodeComm, masterComm; 

MPI_Comm_rank(MPI_COMM_WORLD, &globalRank); 
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, globalRank, 
        MPI_INFO_NULL, &nodeComm); 
MPI_Comm_rank(nodeComm, &localRank); 
MPI_Comm_split(MPI_COMM_WORLD, localRank, globalRank, &masterComm); 
MPI_Comm_free(&nodeComm); 

if (localRank == 0) { 
    // Now, each process of masterComm is on a different node 
    // so you can play with them to do what you want 
    int mRank, mSize; 
    MPI_Comm_rank(masterComm, &mRank); 
    MPI_Comm_size(masterComm, &mSize); 
    // do something here 
} 

MPI_Comm_free(&masterComm); 

EDIT:

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

char name[MPI_MAX_PROCESSOR_NAME]; 
int len; 
MPI_Get_processor_name(name, &len); 
printf("Node number %d/%d is %s\n", mRank, mSize, name); 

Теперь, если это единственное, что вы хотите сделать, вы бы, вероятно, гораздо лучше в расследовании вокруг MPI инструмент представления работы, которая может быть, в зависимости от вас MPI ароматизатора , mpirun, mpiexec, prun, srun, orterun и т. Д. Обычно они содержат аргументы командной строки, позволяющие выбрать количество запущенных процессов, количество используемых узлов, количество процессов на узел и даже некоторые способы точно размещения каждый процесс на разных выбранных узлах. Например, вы можете найти (потенциал) -npernode, который обе библиотеки OpenMPI и MPICH предлагают для своих утилит mpirun.

Вы могли бы, например, просто использовать:

mpirun -npernode 1 hostname 
+0

Большое спасибо. Да, это то, что мне нужно. – Matrix