【问题标题】:MPI combined non-blocking send and receive with waitall in CMPI在C中将非阻塞发送和接收与waitall相结合
【发布时间】:2018-09-19 07:18:08
【问题描述】:

我需要制作一个使用 MPI 非阻塞发送和接收调用来与合作伙伴任务通信的程序。伙伴任务是任务等级 + numberOfTask/2,反之亦然。发送给合作伙伴的消息是发件人等级。

我试过这样做:

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define  MASTER     0

int main (int argc, char *argv[]) {
    int  i, numtasks, taskid, len, partner, message;
    char hostname[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

    MPI_Request reqsTx[numtasks], reqsRx[numtasks];
    MPI_Status stats[numtasks];

    /* need an even number of tasks  */
    if (numtasks % 2 != 0) {
        if (taskid == MASTER) 
            printf("Quitting. Need an even number of tasks: numtasks=%d\n", numtasks);
    } else {
        if (taskid == MASTER) 
            printf("MASTER: Number of MPI tasks is: %d\n", numtasks);

        MPI_Get_processor_name(hostname, &len);
        printf ("Hello from task %d\n", taskid);

        /* determine partner and then send to partner */
        if (taskid < numtasks/2) {
            partner = numtasks/2 + taskid;
            MPI_Isend(&taskid, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqsTx[taskid]);
        } else if (taskid >= numtasks/2) {
            partner = taskid - numtasks/2;
            MPI_Isend(&taskid, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqsTx[taskid]);
        }

        printf ("Send %d completed\n", taskid);
        MPI_Waitall(numtasks, reqsTx, stats);
        printf("Done waiting for transmit!");

        /* determine partner and then receive from partner */
        if (taskid < numtasks/2) {
            MPI_Irecv(&message, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqsRx[taskid]);
        } else if (taskid >= numtasks/2) {
            MPI_Irecv(&message, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqsRx[taskid]);
        }

        printf ("Receive %d completed\n", taskid);
        MPI_Waitall(numtasks, reqsRx, stats);
        printf("Done waiting for receive!");

        /* print partner info and exit*/
        printf("Task %d is partner with %d\n", taskid, message);
    }
    MPI_Finalize();
}

但是第一个 MPI_Waital(numtasks, reqsTx, stats);失败并且程序终止。有谁知道我在这里做错了什么?

最好的问候

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    我想我找到了问题所在。问题似乎是我试图创建比需要更多的请求。

    #include "mpi.h"
    #include <stdio.h>
    #include <stdlib.h>
    #define  MASTER     0
    
    int main (int argc, char *argv[]) {
        int  i, numtasks, taskid, len, partner, message;
        char hostname[MPI_MAX_PROCESSOR_NAME];
    
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
        MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
    
        MPI_Status stats[2];
        MPI_Request reqs[2];
    
        /* need an even number of tasks  */
        if (numtasks % 2 != 0) {
            if (taskid == MASTER) 
                printf("Quitting. Need an even number of tasks: numtasks=%d\n", numtasks);
        } else {
            if (taskid == MASTER) 
                printf("MASTER: Number of MPI tasks is: %d\n", numtasks);
    
            MPI_Get_processor_name(hostname, &len);
            printf ("Hello from task %d\n", taskid);
    
            if (taskid < numtasks/2) 
                partner = numtasks/2 + taskid;
            else if (taskid >= numtasks/2) 
                partner = taskid - numtasks/2;
    
            MPI_Irecv(&message, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqs[0]);
            MPI_Isend(&taskid, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &reqs[1]);
    
            MPI_Waitall(2, reqs, stats);
            if (taskid == MASTER) 
                printf("Done waiting!\n");
    
            /* print partner info and exit*/
            printf("Task %d is partner with %d\n", taskid, message);
        }
        MPI_Finalize();
    }
    

    【讨论】:

    • 注意MPI_Sendrecv() 更合适,因为它将 isend/irecv/waitall 组合在一个操作中。个人喜好也可以partner = (taskid + numtasks/2) % numtasks;
    猜你喜欢
    • 2012-08-24
    • 2021-12-30
    • 1970-01-01
    • 2013-03-07
    • 2014-08-15
    • 2011-05-03
    • 2011-05-25
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多