混合 openMP/MPI 代码中的多线程在 sending/receiving 中出错
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) 失败
名片中缺少主机名或无效 host/port 描述
[1] 致命错误
MPI_Recv 中的致命错误:其他 MPI 错误,错误堆栈:
MPI_Recv(buf=0x00007FF67497F33C, count=1, MPI_INT, src=0, tag=1, MPI_COMM_WORLD, status=0x00007FF67497F348) 失败
没有 space 共享内存队列名称
然后在另一个 运行 中我得到了这个错误:
[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_Init_thread()
和 MPI_THREAD_MULTIPLE
并确保您的图书馆提供此功能。
我在以下代码中使用了 OpenMP 和 MPI。我正在一台多核 Windows 机器上进行测试。
我遇到了这两个错误:
[0] 致命错误 MPI_Send 中的致命错误:其他 MPI 错误,错误堆栈: MPI_Send(buf=0x00007FF67497F33C, count=1, MPI_INT, dest=2, tag=1, MPI_COMM_WORLD) 失败 名片中缺少主机名或无效 host/port 描述
[1] 致命错误 MPI_Recv 中的致命错误:其他 MPI 错误,错误堆栈: MPI_Recv(buf=0x00007FF67497F33C, count=1, MPI_INT, src=0, tag=1, MPI_COMM_WORLD, status=0x00007FF67497F348) 失败 没有 space 共享内存队列名称
然后在另一个 运行 中我得到了这个错误:
[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_Init_thread()
和 MPI_THREAD_MULTIPLE
并确保您的图书馆提供此功能。