MPI 使用消息标签将值按正确顺序排列

MPI using message tag to put the values in right order

我写了一个小程序,我将一些放在数组中的随机值从我的主进程发送到从属进程。奴隶正在计算小方程,他们应该把结果发回给主人。现在主人应该将结果以正确的顺序放置到新的结果数组中。我正在使用消息标签。 以下是方法:

将我的任务列表中的一个元素发送给奴隶

void Ccalculation::masterSend(int * tasklist)
{
    for (int i = 1; i < this->world_size; i++) {
        MPI_Send(&tasklist[current], 1, MPI_INT, i, current, MPI_COMM_WORLD);
        current++;
    }
}

slave从master接收任务

void Ccalculation::slaceRecv()
{

    MPI_Status status;
    MPI_Recv(&slaveTask, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    //here I am creating variable whith tag which I ll be returning
    msgTag = status.MPI_TAG;
    cout << "msg tag: " << status.MPI_TAG << " number " << slaveTask << endl;
}

问题从这里开始

正在将解决方案发送给带有特定标签的大师

void Ccalculation::slaveSend(double solution)
{
        MPI_Send(&solution, 1, MPI_DOUBLE, 0, msgTag, MPI_COMM_WORLD);
}

master接收解并放入solutionArray

void Ccalculation::masterRecv(double *solutionTab)
{
    double buffer = 0;
    MPI_Status status;
    for (size_t i = 0; i < this->world_size; i++)
    {
        MPI_Recv(&buffer, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
        solutionTab[status.MPI_TAG] = buffer;
    }
}

MPI 是解决此类问题的内置函数。它们被称为集体行动。特别是,要将任务列表中的元素(如您所称)分发到不同的进程,您可以使用 MPI_Scatter. The reverse operation of collecting one element from each process is realized by MPI_gather.

您只需一行代码即可替换 masterSendslaceRecv 函数:

MPI_Scatter(tasklist, this->world_size, MPI_INT, &current, 1, MPI_INT, 0, MPI_COMM_WORLD);

类似地,您可以使用 MPI_Gather.

仅用一行代码替换函数 slaveSendmasterRecv