MPI和C++/Qt混用的收发消息的例子(主从模式)

1、main.cpp

//main.cpp
#include<iostream>
#include<mpi.h>
#include <QtCore>
#include <QThread>

enum MyTag
{
    TAG_TEST = 1,
    TAG_TEST_RSP,
    TAG_FORECAST,
    TAG_COLWARN
};

void doMaster()
{
    MPI_Status status;
    QList<int> dataList;
    for (int i = 0; i < 20000; ++i)
    {
        dataList << i;
    }
    
    char message[100] = {0};
    int nCoreSize;
    MPI_Comm_size(MPI_COMM_WORLD, &nCoreSize);
    for (int i = 1; i < nCoreSize; ++i)
    {
        sprintf(message, "Message-%05d", i);
        MPI_Send(message, strlen(message), MPI_CHAR, i, TAG_TEST, MPI_COMM_WORLD);
    }
    
    std::cout << "Master Sent Over\n";
    
    int nCoreId;
    int nRspCout = 0;
    while (nRspCout < nCoreSize-1)
    {
        //使用MPI_ANY_SOURCE 接收每轮优先到达的消息
        int ret = MPI_Recv((void*)(&nCoreId), 1, MPI_INT, MPI_ANY_SOURCE, TAG_TEST_RSP, MPI_COMM_WORLD, &status);
        if (ret != 0) std::cout << "Master recv ret: " << ret << "," << status.MPI_ERROR  << std::endl;
        
        if (status.MPI_ERROR == 0)
        {
            nRspCout++;
            printf("Master recv response from #%d, %d/%d\n", nCoreId, nRspCout, nCoreSize-1);
        }

    }
    std::cout << "Master END" << std::endl;
}

void doSlave(int nCoreId)
{
    MPI_Status status;
    char message[100] = {0};
    while (true)
    {
        QThread::msleep(100 + qrand() % 100); //使其随机化
        MPI_Recv((void*)&message, 100, MPI_CHAR, 0, TAG_TEST, MPI_COMM_WORLD, &status);
        if (status.MPI_ERROR != 0)
        {
            QThread::msleep(10);
            continue;
        }
        
        std::cout << "Slave revec message (" << message << ") by core " << nCoreId << std::endl;
        MPI_Send((void*)(&nCoreId), 1, MPI_INT, 0, TAG_TEST_RSP, MPI_COMM_WORLD);
        break;
    };
}

int main(int argc,char* argv[])
{
    int nCoreId;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&nCoreId);

    if (nCoreId == 0)
    {
        doMaster();
    }
    else
    {
        doSlave(nCoreId);
    }
    
    MPI_Finalize();
    return 0;
}

2、TestCpp.pro 

#pro file
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
#CONFIG -= qt
QT       -= gui

SOURCES += \
        main.cpp

INCLUDEPATH += /usr/mpi/gcc/openmpi-4.0.4rc3/include/
LIBS += -L/usr/mpi/gcc/openmpi-4.0.4rc3/lib64/ -lmpi

3、运行结果示例

$ mpirun -np 8 TestCpp
Master Sent Over
Slave revec message (Message-00006) by core 6
Master recv response from #6, 1/7
Slave revec message (Message-00001) by core 1
Master recv response from #1, 2/7
Slave revec message (Message-00007) by core 7
Master recv response from #7, 3/7
Slave revec message (Message-00002) by core 2
Master recv response from #2, 4/7
Slave revec message (Message-00005) by core 5
Slave revec message (Message-00004) by core 4
Master recv response from #4, 5/7
Master recv response from #5, 6/7
Slave revec message (Message-00003) by core 3
Master recv response from #3, 7/7
Master END

相关推荐

  1. MPIC++/Qt收发消息例子主从模式

    2023-12-15 09:12:03       54 阅读
  2. js构造模式解释例子优缺点

    2023-12-15 09:12:03       29 阅读
  3. oraclejson_arrayagg例子

    2023-12-15 09:12:03       30 阅读
  4. Oraclelistagg例子

    2023-12-15 09:12:03       25 阅读
  5. 2024-02-04 C 与 C++ calloc new 导致问题

    2023-12-15 09:12:03       54 阅读
  6. 设计模式--命令模式简单例子

    2023-12-15 09:12:03       61 阅读
  7. spring boot kafka 发送消息 完整例子工程

    2023-12-15 09:12:03       60 阅读
  8. 一个GVN无法消除例子

    2023-12-15 09:12:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-15 09:12:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-15 09:12:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-15 09:12:03       82 阅读
  4. Python语言-面向对象

    2023-12-15 09:12:03       91 阅读

热门阅读

  1. redis集群模糊获取缓存redisKey

    2023-12-15 09:12:03       60 阅读
  2. ES6简化对象

    2023-12-15 09:12:03       50 阅读
  3. zookeeper集群安装

    2023-12-15 09:12:03       58 阅读
  4. 华为HCIP认证H12-821题库下

    2023-12-15 09:12:03       45 阅读
  5. 【数据库设计和SQL基础语法】--查询数据--排序

    2023-12-15 09:12:03       57 阅读
  6. Web3.0和WebAssembly

    2023-12-15 09:12:03       48 阅读
  7. 【影像组学入门百问】#22—#24

    2023-12-15 09:12:03       53 阅读
  8. Git 的基本概念和使用方式。

    2023-12-15 09:12:03       65 阅读
  9. STM32系统滴答定时器SysTick实现精确ms和us延时

    2023-12-15 09:12:03       55 阅读