0

MPI で論理リングを実装しようとしています。ここで、すべてのプロセスは、現在のプロセスの ID よりも 1 つ小さい ID を持つプロセスからメッセージを受信し、周期的に次のプロセスに転送します。私の目的は、一部のメッセージが失われたり、順番が狂ったりするようにバッファをトラフィックすることです。
ルートノードから送信されたメッセージが再びルートに戻ってくると、通信のサイクルは終了します。
これが私が試したコードです。関連する部分を含めているだけです。

if(procId!=root)
{
    sleep(100);
    while(1)
    {
        tm = MPI_Wtime();
        MPI_Irecv( &message, STR_LEN, MPI_CHAR,
                ((procId-1)>=0?(procId-1):(numProc-1)),RETURN_DATA_TAG,
                MPI_COMM_WORLD,&receiveRequest);

        MPI_Wait(&receiveRequest,&status);
        printf("%d: Received\n",procId);

        if(!strncmp(message,"STOP",4)&&(procId==(numProc-1)))
            break;

        MPI_Ssend( message, STR_LEN, MPI_CHAR,
                (procId+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD);
        if(!strncmp(message,"STOP",4))
            break;
        printf("%d: Sent\n",procId);
    }
}
else
{
    for(iter=0;iter<benchmarkSize;iter++)
    {
        //Synthesize the message
        message[STR_LEN-1] = '\0';
        iErr = MPI_Bsend( message, STR_LEN, MPI_CHAR,
                (root+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD);
        if (iErr != MPI_SUCCESS) {
            char error_string[BUFSIZ];
            int length_of_error_string;
            MPI_Error_string(iErr, error_string, &length_of_error_string);
            fprintf(stderr, "%3d: %s\n", procId, error_string);
        }

        tm = MPI_Wtime();
        while(((MPI_Wtime()-tm)*1000)<delay);
        printf("Root: Sending\n");
    }
    for(iter=0;iter<benchmarkSize;iter++)
    {
        MPI_Recv(message,STR_LEN,MPI_CHAR,
                (numProc-1),RETURN_DATA_TAG,MPI_COMM_WORLD,&status);

        //We should not wait for the messages to be received but wait for certain amount of time

        //Extract the fields in the message
        if(((prevRcvdSeqNum+1)!=atoi(seqNum))&&(prevRcvdSeqNum!=0))
            outOfOrderMsgs++;
        prevRcvdSeqNum = atoi(seqNum);
        printf("Seq Num: %d\n",atoi(seqNum));
        rcvdMsgs++;
        printf("Root: Receiving\n");
    }
    MPI_Isend( "STOP", 4, MPI_CHAR,
            (root+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD,&sendRequest);
    MPI_Wait(&sendRequest,&status);

    /*This is to ask all other processes to terminate, when the work is done*/
}

ここで、これらの質問があります。1) リングの他のプロセス (ルート以外を意味します) にスリープを挿入すると、なぜですか? NO レシーブ中?
2) バッファ サイズが 1 つしかない場合でも、ルート ノードがエラーなしで MPI_Bsend を介してメッセージをディスパッチできるのはなぜですか? たとえば、1 秒あたり 1000 の速度で合計 10 個のメッセージを送信する必要がある場合、バッファ サイズは 1 です。MPI_Bsend は、「バッファがいっぱい」のエラーなしですべてのメッセージをディスパッチできます。リングの他のプロセスに sleep() が存在するかどうかに関係なく! ありがとうございます!

4

0 に答える 0