簡體   English   中英

openMP / MPI混合代碼中的多線程發送/接收錯誤

[英]Error in sending/receiving by multi-threads in hybrid openMP/MPI code

我在以下代碼中使用OpenMP和MPI。 我正在一台多核Windows計算機上進行測試。

我遇到了兩個錯誤:

[0]致命錯誤MPI_Send中的致命錯誤:其他MPI錯誤,錯誤堆棧:MPI_Send(buf = 0x00007FF67497F33C,count = 1,MPI_INT,dest = 2,tag = 1,MPI_COMM_WORLD)失敗缺少主機名或業務中無效的主機/端口描述卡

[1]致命錯誤MPI_Recv中的致命錯誤:其他MPI錯誤,錯誤堆棧:MPI_Recv(buf = 0x00007FF67497F33C,count = 1,MPI_INT,src = 0,tag = 1,MPI_COMM_WORLD,status = 0x00007FF67497F348)共享內存空間不足隊列名稱

然后在另一個運行中,我得到了這個錯誤:

[0]致命錯誤MPI_Send中的致命錯誤:其他MPI錯誤,錯誤堆棧:MPI_Send(buf = 0x000000172E31FCC4,count = 1,MPI_INT,dest = 2,tag = 1,MPI_COMM_WORLD)失敗先前嘗試與2通訊失敗

#include<iostream>
#include "mpi.h"
#include <omp.h>

using namespace std;

int numOfProc, id, array_size, portion;
int *arr = NULL;
MPI_Status status;
const static int tag = 1;


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

    cout << "Hello from Process # " << id << '\n';

    int data; 

    omp_set_num_threads(2);
#pragma omp parallel for
    for (int i = 1; i < 20; i++)
    {
        if (id == 0)//master
        {
            for (int p = 1; p < numOfProc; p++)
            {
                data = i*p;
                MPI_Send(&data, 1, MPI_INT, p, tag, MPI_COMM_WORLD);
            }
        }
        else // slaves 
        {
            MPI_Recv(&data, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
            cout << "Process " << id << " recieved " << data << " by thread " << omp_get_thread_num() << endl; 
        }
    }

    MPI_Finalize();
}

首先,您需要使用MPI_THREAD_MULTIPLE MPI_Init_thread()並確保您的庫確實提供了此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM