为啥我会收到使用 MPI 屏障 [c++] 的致命错误

Posted

技术标签:

【中文标题】为啥我会收到使用 MPI 屏障 [c++] 的致命错误【英文标题】:Why am I receiving a fatal error using MPI barriers [c++]为什么我会收到使用 MPI 屏障 [c++] 的致命错误 【发布时间】:2020-06-14 21:07:45 【问题描述】:

我是 MPI 新手,在尝试使用障碍时遇到了致命错误。我有一个简单的 for 循环,它以循环方式将索引分配给每个进程,紧随其后的是 MPI 屏障:

mpi.cc

#include <iostream>
#include <mpi.h>
#include <vector>
#include <sstream>

int main() 
    int name_len, rank, comm_size;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    MPI_Init(NULL, NULL);
    MPI_Get_processor_name(processor_name, &name_len);
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Comm_rank(comm, &rank);
    MPI_Comm_size(comm, &comm_size);
    std::stringstream ss;    
    ss << "hello from: " << processor_name << " " << "Rank: " << rank << " Comm size: " << comm_size << "\n";

    for (int i =0; i < 20; i++) 
        if (i%comm_size != rank) continue;
        ss << "   " << i << "\n";
    

    MPI_Barrier(comm);                          // Fails here
    std::cout << ss.str();
    MPI_Finalize();

我编译:

mpicxx mpi.cc -o mpi

然后在我的 2 节点集群上运行:

mpirun -ppn 1 --hosts node1,node2 ./mpi

我收到以下错误:

Fatal error in PMPI_Barrier: Unknown error class, error stack:
PMPI_Barrier(414).....................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(321)................: Failure during collective
MPIR_Barrier_impl(316)................: 
MPIR_Barrier(281).....................: 
MPIR_Barrier_intra(162)...............: 
MPIDU_Complete_posted_with_error(1137): Process failed
Fatal error in PMPI_Barrier: Unknown error class, error stack:
PMPI_Barrier(414).....................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(321)................: Failure during collective
MPIR_Barrier_impl(316)................: 
MPIR_Barrier(281).....................: 
MPIR_Barrier_intra(162)...............: 
MPIDU_Complete_posted_with_error(1137): Process failed

在一个节点上运行有效,但在 2 上运行时失败。有什么想法可能会出错吗?

【问题讨论】:

也许 OT:MPI_Init(NULL, NULL); 根据 MPI 文档,您不能在此处通过 NULL 【参考方案1】:

我设法解决了我的问题。而不是

mpirun -ppn 1 --hosts node1,node2 ./mpi

我分别明确使用了node1和node2的ip地址,不再出现问题。看来问题出在我的 /etc/hosts 文件上:

127.0.0.1   localhost
127.0.0.1   node1

似乎主机试图访问 localhost 而不是 node1。更多信息here。

【讨论】:

以上是关于为啥我会收到使用 MPI 屏障 [c++] 的致命错误的主要内容,如果未能解决你的问题,请参考以下文章

MPI_Irecv 中的致命错误:正在中止作业

共享内存中进程间的屏障实现

测试 MPI_Barrier C++

MPI 中的屏障:如何实现屏障以使进程相互等待

为啥我会收到此错误? “[variable] 没有命名类型”在 C++ 中用于 std::string 数组,即使它已被包含并且在同一范围内

为啥 MPI_Barrier 在 C++ 中会导致分段错误