OpenMPI MPI_Send против Intel MPI MPI_Send - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть код, который я компилирую и запускаю с использованием openmpi.В последнее время я хотел запустить этот же код с использованием Intel MPI.Но мой код не работает, как ожидалось.Я покопался в коде и обнаружил, что MPI_Send ведет себя по-разному в обеих реализациях.

Я получил совет с другого форума использовать MPI_Isend вместо MPi_Send с другого форума.Но это требует огромной работы по модификации кода.Есть ли обходной путь в Intel MPI, чтобы он работал так же, как в OpenMPI.Это могут быть флаги или увеличительный буфер или что-то еще.Заранее спасибо за ваши ответы.

int main(int argc, char **argv) {
    int numRanks;
    int rank;
    char cmd[] = "Hello world";
    MPI_Status status;

    MPI_Init (&argc, &argv);
    MPI_Comm_size (MPI_COMM_WORLD, &numRanks);
    MPI_Comm_rank (MPI_COMM_WORLD, &rank);
    if(rank == 0) {
            for (int i=0; i< numRanks; i++) {
                    printf("Calling MPI_Send() from rank %d to %d\n", rank, i);
                  MPI_Send(&cmd,sizeof(cmd),MPI_CHAR,i,MPI_TAG,MPI_COMM_WORLD);
                    printf("Returned from MPI_Send()\n");
            }
    }
    MPI_Recv(&cmd,sizeof(cmd),MPI_CHAR,0,MPI_TAG,MPI_COMM_WORLD,&status);
    printf("%d receieved from 0 %s\n", rank, cmd);

    MPI_Finalize();
}

Результат OpenMPI

# mpirun --allow-run-as-root  -n 2  helloworld_openmpi
Calling MPI_Send() from rank 0 to 0
Returned from MPI_Send()
Calling MPI_Send() from rank 0 to 1
Returned from MPI_Send()
0 receieved from 0 Hello world
1 receieved from 0 Hello world

Результат Intel MPI

# mpiexec.hydra -n 2 /root/helloworld_intel

Calling MPI_Send() from rank 0 to 0

Застрял в MPI_Send.

1 Ответ

0 голосов
/ 14 февраля 2019

Неправильно полагать, что MPI_Send() вернется до публикации соответствующего получения, поэтому ваш код неверен по отношению к стандарту MPI, и вам повезло, что он не зависал с Open MPI.

Реализация MPI обычно eager-send маленьких сообщений, поэтому MPI_Send() может вернуться немедленно, но это вариант реализации, не предусмотренный стандартом, и «маленькое» сообщение зависит от версии библиотеки, используемого вами соединенияи другие факторы.

Единственный безопасный и переносимый выбор здесь - это написать правильный код.

FWIW, MPI_Bcast(cmd, ...) лучше подходит здесь, если все ранги уже знают длину строки плюсТерминатор NUL.

Последний, но не менее важный аргумент буфера: cmd, а не &cmd.

...