Ограничение обмена данными с использованием MPI c ++ - PullRequest
0 голосов
/ 11 мая 2018

Я пишу код MPI C ++ для обмена данными, ниже приведен пример кода:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    int size, rank;
    int dest, tag, i;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    printf("SIZE = %d RANK = %d\n",size,rank);

    if ( rank == 0 )
    {
        double data[500];
        for (i = 0; i < 500; i++) 
        {
            data[i] = i;
        }
        dest = 1;
        tag = 1;
        MPI_Send(data,500,MPI_DOUBLE,dest,tag, MPI_COMM_WORLD );
    }

    MPI_Finalize();   
    return(0);
}

Похоже, 500 - это максимум, который я могу отправить.Если количество данных увеличивается до 600, кажется, что код останавливается на «MPI_SEND» без дальнейшего продвижения.Я подозреваю, есть ли какие-либо ограничения для передачи данных с использованием MPI_SEND.Можете ли вы кого-нибудь просветить меня?

Заранее спасибо,

Кан

1 Ответ

0 голосов
/ 11 мая 2018

Короче говоря, ваша программа неверна, и вам повезло, что она не зависала с небольшим счетом.

В соответствии со стандартом MPI, вы не можете предполагать, что MPI_Send() вернется, если соответствующий MPI_Recv() не имеетбыл опубликован.

С прагматической точки зрения "короткие" сообщения обычно отправляются в активном режиме, и MPI_Send(), скорее всего, сразу возвращается.С другой стороны, «длинные» сообщения обычно включают протокол рандеву и, следовательно, зависают до тех пор, пока не будет отправлено соответствующее сообщение.

«маленький» и «длинный» зависят от нескольких факторов, включая соединение, которое выИспользуем.И снова, вы не можете предполагать, что MPI_Send() всегда будет возвращаться немедленно, если вы отправляете сообщения, которые достаточно малы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...