【问题标题】:MPI using message tag to put the values in right orderMPI 使用消息标签将值按正确顺序排列
【发布时间】:2016-09-12 07:37:36
【问题描述】:

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

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

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;
    }
}

【问题讨论】:

  • 运行代码时究竟出现了什么问题?您是否在 masterSend 中初始化 current = 0?

标签: c++ mpi communication


【解决方案1】:

MPI 是解决此类问题的内置函数。它们被称为集体经营。特别是,要将任务列表中的元素分发到不同的进程,正如您所说的那样,您可以使用MPI_Scatter。每个进程收集一个元素的逆向操作由MPI_gather实现。

您只需一行代码即可替换 masterSend 和 slaceRecv 函数:

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

类似地,您可以使用MPI_Gather,用一行代码替换您的函数slaveSend 和masterRecv。

【讨论】:

  • 在我的项目中,我只需要使用 MPI_Send 和 MPI_Recv 函数,问题已解决,但非常感谢 :)
猜你喜欢
  • 2014-01-05
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2018-07-30
  • 2014-08-23
  • 2015-02-17
相关资源
最近更新 更多