C++ Open-MPI:自定义结构类型无法通过 Ssend 发送

Posted

技术标签:

【中文标题】C++ Open-MPI:自定义结构类型无法通过 Ssend 发送【英文标题】:C++ Open-MPI: custom struct type Not able to send over Ssend 【发布时间】:2014-06-02 12:48:07 【问题描述】:

所以我正在使用 MPI 开发一个项目,并且我正在尝试创建自己的结构。我遇到的问题是它似乎无法正常工作,因为我从未在工作人员内部收到任何东西,所以我超时了。我尝试使用标准的 MPI_INT,效果很好。但是,当我尝试实现自己的类型时,它不喜欢它......这是我的代码:

#include <iostream>
#include <mpi.h>
#include "main.hpp"

int main(int argc, char *argv[])
    //initialize MPI
    MPI_Init(&argc, &argv);

    message_to_worker message;
    //declare my new type
    MPI_Datatype MessageType;

    //declare the types the the structure will have
    MPI_Datatype type[1] =  MPI_INT ;
    //the number of results for each type(int[50] will be 50 etc..)
    int blocklen[1] = 1;

    //this will store the displacement for each var in the structure
    MPI_Aint disp[1] = 0;
    MPI_Aint var1, var2;

    //number of vars
    int count = 1;

    //define the type
    MPI_Type_struct(count, blocklen, disp, type, &MessageType);
    MPI_Type_commit(&MessageType); 

    std::cout << "The displacement is " << disp[0] << std::endl;

    int rank;
    int world_size;

    //give me my current rank(node 1 reiceves 1 , node 2 etc... )
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int counter = 1;
    message.N = 5;

    //IF MASTER
    if (rank == 0) 
        int result;

        //send messages to the workers
        while(counter<world_size)
            //send 1 message of type MessageType using my own structure(first parameter)
            result = MPI_Ssend(&message, 1, MessageType, counter, 123, MPI_COMM_WORLD);

            //make sure the mssage was sent correctly
            if (result == MPI_SUCCESS)
                std::cout << "I am master and the world size is : " << world_size << std::endl;
                std::cout << " I send a message to mky worker thread " << std::endl;
            else
                std::cout << "There was a problem with the sending for worker " << counter << std::endl;
            
            counter++;
        
    
    //IF WORKER
    else if (rank > 0) 
        //the worker will wait until it receives a message
        int result = MPI_Recv(&message, 1, MessageType, 0, 0, MPI_COMM_WORLD,
                  MPI_STATUS_IGNORE);

        //make sure the message was RECEIVED correctly
        if (result == MPI_SUCCESS)
            std::cout << "Worker - Rank: " << rank <<" OK! and the value received through the message is " << message.N << std::endl;
        
    

    //shutdown MPI
    MPI_Finalize();
    return 0;


【问题讨论】:

请将您的解决方案变成答案,等待计时器超时并接受它。 一个不请自来的建议:检查 MPI 通信调用的返回值是没有意义的,除非您明确更改了通信器的错误处理程序(您还没有这样做)。默认处理程序会在出错时终止程序,这就是为什么您永远不会看到除MPI_SUCCESS 之外的任何返回码。 @HristoIliev,谢谢。我绝对不知道,我很感激你的建议! 【参考方案1】:

发送者和接收者的标签参数(最后的 3 个参数)不同。主人使用标签 123,工作人员正在寻找标签 0。它们都需要同步,因为它们需要建立通信渠道。这是修复(注意第 5 个参数,标签是如何改变的)。

之前:

MPI_Ssend(&message, 1, MessageType, counter, 123, MPI_COMM_WORLD);

MPI_Recv(&message, 1, MessageType, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

之后

MPI_Ssend(&message, 1, MessageType, counter, 123, MPI_COMM_WORLD);

MPI_Recv(&message, 1, MessageType, 0, 123, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

【讨论】:

以上是关于C++ Open-MPI:自定义结构类型无法通过 Ssend 发送的主要内容,如果未能解决你的问题,请参考以下文章

为非托管 (C++) 代码编写托管包装器 - 自定义类型/结构

C++语法 第四篇 自定义类型

无法在具有自定义运算符 ==() 的 c++ 无序集中找到用户定义的类型

如何自定义 C++ 类和结构的 STAssertEquals 输出?

c++自定义类型

自定义数据结构初探