OpenMPI уменьшить с помощью MINLOC - PullRequest
7 голосов
/ 24 ноября 2011

В настоящее время я работаю над некоторым кодом MPI для задачи теории графов, в которой каждый узел может содержать ответ и длину этого ответа.Чтобы вернуть все на главный узел, я делаю MPI_Gather для ответов и пытаюсь сделать MPI_Reduce, используя операцию MPI_MINLOC, чтобы выяснить, у кого было самое короткое решение.Прямо сейчас мой тип данных, который хранит длину и идентификатор узла, определен как (согласно примерам, показанным на многочисленных сайтах, таких как http://www.open -mpi.org / doc / v1.4 / man3 / MPI_Reduce.3.php ):

struct minType
{
    float len;
    int index;
};

На каждом узле я инициализирую локальные копии этой структуры следующим образом:

int commRank;
MPI_Comm_rank (MPI_COMM_WORLD, &commRank);
minType solutionLen;
solutionLen.len = 1e37;
solutionLen.index = commRank;

В конце выполнения у меня есть вызов MPI_Gather, который успешносносит все решения (я распечатал их из памяти, чтобы проверить их) и вызов:

MPI_Reduce (&solutionLen, &solutionLen, 1, MPI_FLOAT_INT, MPI_MINLOC, 0, MPI_COMM_WORLD);

Насколько я понимаю, аргументы должны быть:

  1. Источник данных
  2. является целью для результата (значимым только для назначенного корневого узла)
  3. Количество элементов, отправленных каждым узлом
  4. Тип данных(MPI_FLOAT_INT, по-видимому, определяется на основе вышеуказанной ссылки)
  5. Операция (MPI_MINLOC, по-видимому, также определяется)
  6. Идентификатор корневого узла в указанной группе связи
  7. Группа связи, которая должна ждать.

Когда мой код переходит к операции сокращения, я получаю эту ошибку:

[compute-2-19.local:9754] *** An error occurred in MPI_Reduce
[compute-2-19.local:9754] *** on communicator MPI_COMM_WORLD
[compute-2-19.local:9754] *** MPI_ERR_ARG: invalid argument of some other kind
[compute-2-19.local:9754] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 9754 on
node compute-2-19.local exiting improperly. There are two reasons this could occur:

1. this process did not call "init" before exiting, but others in
the job did. This can cause a job to hang indefinitely while it waits
for all processes to call "init". By rule, if one process calls "init",
then ALL processes must call "init" prior to termination.

2. this process called "init", but exited without calling "finalize".
By rule, all processes that call "init" MUST call "finalize" prior to
exiting or it will be considered an "abnormal termination"

This may have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).
--------------------------------------------------------------------------

Я признаю, что был полностью озадачен этим.В случае, если это имеет значение, я компилирую, используя OpenMPI 1.5.3 (собранный с помощью gcc 4.4) в кластере Rocks на основе CentOS 5.5.

1 Ответ

4 голосов
/ 24 ноября 2011

Я думаю, что вы не можете использовать один и тот же буфер для ввода и вывода (первые два аргумента).Страница man сообщает:

Когда коммуникатор является внутрикоммуникатором, вы можете выполнить операцию уменьшения на месте (выходной буфер используется в качестве входного буфера).Используйте переменную MPI_IN_PLACE в качестве значения корневого процесса sendbuf.В этом случае входные данные берутся в корне из приемного буфера, где они будут заменены выходными данными.

...