MPI блокиране (интерфейс за предаване на съобщения)

Аз съм начинаещ в MPI кодирането, опитах се да предам съобщение, използвайки прост двуизмерен масив, разделяйки процеса на два елемента на процеса...но кодът засяда при предаване на съобщение...кодът е следният...редактирах като поръчка за изпращане и получаване

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

double a[15][15];

int main(int argc, char **argv)
{
    int process_id,nprocess;
    int i,j;
    int Nxl=5,Nx=10,Ny=10;
    MPI_Status status;
    MPI_Datatype line;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&nprocess);
    MPI_Comm_rank(MPI_COMM_WORLD,&process_id);
    //Nxl=((Nx-2)/nprocess)+2;
    //printf("NXL=%d\n",Nxl);
    //  printf("process_id=%d\n",process_id);
    if(process_id==0)
    {
        for(i=1;i<=5;i++)
        {
            for(j=1;j<=Ny;j++)
            {
                a[i][j]=3*2*i;
                MPI_Send(&a[Nxl-1][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
            }
        }
        for(i=1;i<=5;i++)
        {
            for(j=1;j<=Ny;j++)
            {
                printf("matrices=%f\n",a[i][j]);
                MPI_Recv(&a[1][j],1,MPI_DOUBLE,1,1,MPI_COMM_WORLD,&status);
                printf("PROCESS_ID=%d\n",process_id);
            }
        }
    }
    if(process_id==1)
    {
        for(i=6;i<=10;i++)
        {
            for(j=1;j<Ny;j++)
            {
                a[i][j]=4*2;
                MPI_Send(&a[2][j],1,MPI_DOUBLE,1,2,MPI_COMM_WORLD);
            }
        }
        for(i=6;i<=10;i++)
        {
            for(j=1;j<Ny;j++)
            {
                MPI_Recv(&a[Nxl][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&status);
                printf("PROCESS_ID=%d\n",process_id);
            }
        }
    }
    MPI_Finalize();
}

mpi
person Ankit    schedule 30.01.2014    source източник
comment
MPI_Sendrecv е най-добрият ви приятел в този случай.   -  person Hristo Iliev    schedule 30.01.2014


Отговори (2)


(Ще напиша този отговор, сякаш имате повече от два процеса, за да бъда по-общ за бъдещето, но можете да го интерпретирате повторно, за да означава само два.)

Христо и Джон са прави. Проблемът е, че всички ваши процеси изпращат съобщение, преди някой да го получи. Това означава, че изпращанията може никога да не се върнат. По някакъв начин трябва да се уверите, че приемниците също са налични. Можете да направите това по един от двата начина:

Преобразуване на блокиращите обаждания в неблокиращи

Ако преобразувате вашите блокиращи (MPI_SEND/MPI_RECV) повиквания в неблокиращи повиквания и добавите MPI_WAITALL в края на вашия код, това ще позволи на всички процеси едновременно да изпращат и получават съобщенията. След това след чакането можете да правите каквото искате с данните, които сте получили.

Преобразувайте MPI_SEND/MPI_RECV в MPI_SENDRECV

Тази опция има по същество същия резултат, тъй като ще извършвате изпращането и получаването едновременно, но все пак трябва да внимавате, за да сте сигурни, че всички влизат в обмен с едни и същи процеси. Например, ако имате всички, които се опитват да осъществят комуникация в пръстен, ще трябва да се уверите, че всички те изпращат отдясно и получават отляво (или обратното), вместо да извършват едновременно изпращане и получаване към надясно (което пак би било безизходица).

person Wesley Bland    schedule 30.01.2014

Карате и двамата участници в разговора да говорят, след което да слушат. Трябва да направите така, че единият да говори, а другият да слуша, последвано от обратното.

person John Zwinck    schedule 30.01.2014
comment
Дори след редактиране и извършване на изпращане и получаване независимо, без помощ - person Ankit; 30.01.2014
comment
Можете ли да накарате дори една тривиална MPI програма да работи? Един, който само изпраща веднъж в един процес и получава в другия? - person John Zwinck; 30.01.2014