Задать вопрос
@MuffinLover

Почему виснит программа на MPI?

https://pastebin.com/TYew5UCF
Не могу понять почему виснит программа..
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему виснет программа на MPI?

Потому что процесс с rank = 0 хочет послать VEC_SIZE сообщений, а процессы с rank > 0 обрабатывают каждый только по одному сообщению, после чего завершаются. Тебе нужно как-то объяснить исполнителям, сколько запросов они должны обработать перед завершением. Например так:

if(rank == 0){
                for(int i = 0; i < VEC_SIZE; i++){
                        …
                }
                for (int i = 1; i < size; ++i) {
                        int q = -1;
                        MPI_Send(&q, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
                }
        }else{
                for (;;) {
                        int index;
                        MPI_Status status;
                        MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
                        if (index < 0)
                                break;
                        …
                }
        };


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

И ещё по мелочи:
for(size_t i = 0; i < VEC_SIZE; i++){
            size_t num_process = (i % (size - 1)) + 1;
            MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);

размер size_t i может отличаться от размера int, подразумеваемого типом MPI_INT. Этот код точно будет работать неправильно на big-endian архитектурах с LP64 ABI.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы