簡體   English   中英

MPI_Irecv沒有通過此簡單代碼接收消息

[英]MPI_Irecv doesn't receive message in this easy code

我有這段代碼用於測試MPI_Irecv和MPI_Isend

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } while(flag != 0);

    }
    if(rank==0){
        int cc=0;
        MPI_Request request;
        for(int i=1;i<10;i++){
            cc+=1;
            MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
        }
    }

如果我執行此代碼,有時它會從1到9打印cc,有時它什么也不打印。

這很有意義,因為可以在進程1完成之后執行進程0。

但是,如果我讓進程1是這樣的無限循環:

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } while(true);

    }

我認為進程1每次都會將cc從1打印到9,但不會。

如果我在進程1中插入MPI_Wait(),似乎進程1每次都會將cc從1打印到9。 但是,如果其他進程沒有發送任何消息,並且我實際上希望進行非阻塞通信,它將永遠等待。

回復評論:

1.關於版本:mpiexec --version mpiexec(OpenRTE)2.1.1

2.我不明白“ MPI進度線程”是什么意思。

實際上,我希望每個進程都可以彼此通信而不會阻塞,並且每次接收時都在緩沖區中獲取信息。

3.可執行代碼如下

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

int main(void)
{
    MPI_Comm allcomm;
    int i;
    int size, rank, irank;
    int tablesize, localtablesize;
    int *table,*table2;

    allcomm = MPI_COMM_WORLD;
    MPI_Init(NULL, NULL);
    MPI_Comm_size(allcomm, &size);
    MPI_Comm_rank(allcomm, &rank);

    if(rank==1){
        int cc;
        MPI_Request request;
        MPI_Status status;
        int flag;
        do{
            MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
            //MPI_Wait(&request, &status);
            MPI_Test(&request, &flag, &status);
            if (flag != 0) { 
                printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
            }
        } //while(flag!=0);
        while(true);

    }
    if(rank==0){
        int cc=0;
        MPI_Request request;
        for(int i=1;i<10;i++){
            cc+=1;
            MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
        }
    }
    MPI_Finalize();
}

您的程序不正確。

例如,如果等級1快於等級0 ,則第一個MPI_Test()將不匹配任何消息,然后直接進入MPI_Finalize()

底行,此程序可能在0到10行之間打印。 如果等級1以某種方式落后於等級0 ,則該程序僅打印10行,但是由於兩個等級都不同步,因此這種情況極不可能發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM