Portál AbcLinuxu, 4. května 2024 03:56


Dotaz: Neblokujici prijem zpravy v OpenMPI

11.11.2011 17:34 Marek Kaluza
Neblokujici prijem zpravy v OpenMPI
Přečteno: 178×
Odpovědět | Admin
Zdravim, ve svem programu vyuzivajim OpenMPI mam nasledujici blok kodu:
    if (myid == 0)
    {
        cout << myid << ": Zahajuju prenos" << endl;
        MPI_Send(&message, 1, MPI_INT, 1, TAG, MPI_COMM_WORLD);
        MPI_Send(&message, 1, MPI_INT, 1, TAG, MPI_COMM_WORLD);
        MPI_Send(&message, 1, MPI_INT, 2, TAG, MPI_COMM_WORLD);
    }
    else
    {
        while (1)
        {
            MPI_Irecv(&message, 1, MPI_INT, MPI_ANY_SOURCE, TAG, MPI_COMM_WORLD, &request);
            MPI_Test(&request, &flag, &stat);
            if (flag)
            {
                cout << myid << ": Dostal jsem zpravu od prvniho procesoru" << endl;                   
            }
        }
    }
Program spoustim se 3 procesy a vetsinou vypise pouze:
0: Zahajuju prenos
2: Dostal jsem zpravu od prvniho procesoru
Tzn, zpravu dostane jen treti proces, ale druhy ne. Nekdy se dokonce vypise jen prvni radek. Tipuju ze tam nekde dochazi k deadlocku, ale nemuzu na to prijit kde.

Pokud se divite, proc cyklicky kontroluju pritomnost dat pomoci neblokujiho receive+MPI_Test misto toho abych pouzil standardni MPI_Recv, tak je to z toho duvodu, ze obecne resim problem, aby proces kontrolovat zda mu dosla data, pokud ano, aby nejakym zpusobem odpovedel a pokud ne, tak at provadi jinou cinnost.

Mozna jdu na toto uplne spatne, muzete me prosim nejak nasmerovat?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

12.11.2011 10:42 Marek Kaluza
Rozbalit Rozbalit vše Re: Neblokujici prijem zpravy v OpenMPI
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem zjistil, ze kdyz jako prvni prikaz do toho bloku while(1) dam sleep(1), tak to zacne fungovat mnohem spolehliveji (vypis probehne jak ma), ale i tak se to priblizne v jednom z peti pripadu zasekne.

Pritom tady: https://www.cac.cornell.edu/VW/MPIP2P/waittestfree.aspx jsem o MPI_Test vycetl:

"More practically, MPI_Test permits an event-driven style of programming, in which events are fired whenever a MPI_Test comes back true. This is particularly useful on the receiving side. A receiver can post a nonblocking receive early, then periodically check the status of the receive with MPI_Test."

A to je presne to, o co se neuspesne snazim...

Prikladam jeste kompletni zdrojak:

http://pastebin.com/X3aP6r2J

a skript, ktery pouzivam na preklad a spusteni programu:

http://pastebin.com/yPbNtcKY

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.