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

1、main.cpp

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

相关推荐
fzb5QsS1p19 小时前
告别重复造轮子,Qt 快速开发脚手架
开发语言·qt·php
森G20 小时前
58、最佳实践与注意事项---------多线程、竟态条件和同步
c++·qt
小樱花的樱花21 小时前
1 项目概述
开发语言·c++·qt·ui
MinterFusion1 天前
如何在openKylin 2.0 SP2中安装Qt(v0.2.2)(上)
开发语言·qt·软件开发·系统维护·明德融创·openkylin
特立独行的猫a1 天前
HarmonyOS鸿蒙PC的QT应用开发:(一、开发环境搭建及第一个HelloWorld)
qt·华为·harmonyos·鸿蒙pc
青花瓷1 天前
采用QT下MingW编译opencv4.8.1
开发语言·qt
cpp_learners1 天前
Linux ARM架构 使用 linuxdeployqt 打包QT程序
linux·arm开发·qt
森G1 天前
3.1、移植Qt程序到ARM平台----移植Qt程序到ARM平台(扩展)
arm开发·c++·qt
白杆杆红伞伞1 天前
Qt Event
开发语言·qt
Magic--1 天前
Qt 桌面计算器项目
开发语言·qt