【问题标题】:Unable to run MPI when transfering large data传输大数据时无法运行 MPI
【发布时间】:2014-04-23 22:11:09
【问题描述】:

我使用MPI_Isend 将字符数组传输到从节点。当数组的大小很小时它可以工作,但是当我放大数组的大小时,它就挂在那里了。

在主节点(等级 0)上运行的代码:

MPI_Send(&text_length,1,MPI_INT,dest,MSG_TEXT_LENGTH,MPI_COMM_WORLD);
MPI_Isend(text->chars, 360358,MPI_CHAR,dest,MSG_SEND_STRING,MPI_COMM_WORLD,&request);
MPI_Wait(&request,&status);

在从节点(排名 1)上运行的代码:

MPI_Recv(&count,1,MPI_INT,0,MSG_TEXT_LENGTH,MPI_COMM_WORLD,&status);
MPI_Irecv(host_read_string,count,MPI_CHAR,0,MSG_SEND_STRING,MPI_COMM_WORLD,&request);
MPI_Wait(&request,&status);

您看到MPI_Isend 中的计数参数是360358MPI 似乎太大了。当我设置参数1024 时,它运行良好。

其实这个问题困扰了我几天,我知道MPI传输的数据大小是有限制的。但据我所知,MPI_Send 是用来发送短消息的,MPI_Isend 可以发送更大的消息。所以我使用MPI_Isend

rank 0 的网络配置是:

  [12t2007@comp01-mpi.gpu01.cis.k.hosei.ac.jp ~]$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:1B:21:D9:79:A5  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:393267 errors:0 dropped:0 overruns:0 frame:0
          TX packets:396421 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:35556328 (33.9 MiB)  TX bytes:79580008 (75.8 MiB)

eth0.2002 Link encap:Ethernet  HWaddr 00:1B:21:D9:79:A5  
          inet addr:10.111.2.36  Bcast:10.111.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:133577 errors:0 dropped:0 overruns:0 frame:0
          TX packets:127677 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:14182652 (13.5 MiB)  TX bytes:17504189 (16.6 MiB)

eth1      Link encap:Ethernet  HWaddr 00:1B:21:D9:79:A4  
          inet addr:192.168.1.101  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:206981 errors:0 dropped:0 overruns:0 frame:0
          TX packets:303185 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:168952610 (161.1 MiB)  TX bytes:271792020 (259.2 MiB)

eth2      Link encap:Ethernet  HWaddr 00:25:90:91:6B:56  
          inet addr:10.111.1.36  Bcast:10.111.1.255  Mask:255.255.254.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26459977 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15700862 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:12533940345 (11.6 GiB)  TX bytes:2078001873 (1.9 GiB)
          Memory:fb120000-fb140000 

eth3      Link encap:Ethernet  HWaddr 00:25:90:91:6B:57  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Memory:fb100000-fb120000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1894012 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1894012 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:154962344 (147.7 MiB)  TX bytes:154962344 (147.7 MiB)

排名 1 的网络配置是:

[12t2007@comp02-mpi.gpu01.cis.k.hosei.ac.jp ~]$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:1B:21:D9:79:5F  
          inet addr:192.168.0.102  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:328449 errors:0 dropped:0 overruns:0 frame:0
          TX packets:278631 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:47679329 (45.4 MiB)  TX bytes:39326294 (37.5 MiB)

eth0.2002 Link encap:Ethernet  HWaddr 00:1B:21:D9:79:5F  
          inet addr:10.111.2.37  Bcast:10.111.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:94126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:53782 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:8313498 (7.9 MiB)  TX bytes:6929260 (6.6 MiB)

eth1      Link encap:Ethernet  HWaddr 00:1B:21:D9:79:5E  
          inet addr:192.168.1.102  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:121527 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41865 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:158117588 (150.7 MiB)  TX bytes:5084830 (4.8 MiB)

eth2      Link encap:Ethernet  HWaddr 00:25:90:91:6B:50  
          inet addr:10.111.1.37  Bcast:10.111.1.255  Mask:255.255.254.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26337628 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15500750 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:12526923258 (11.6 GiB)  TX bytes:2032767897 (1.8 GiB)
          Memory:fb120000-fb140000 

eth3      Link encap:Ethernet  HWaddr 00:25:90:91:6B:51  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Memory:fb100000-fb120000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1895944 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1895944 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:154969511 (147.7 MiB)  TX bytes:154969511 (147.7 MiB)

【问题讨论】:

  • 您的问题有点不清楚代码实际上在做什么。你能发布一个最低限度的工作示例吗? (sscce.org)
  • 没有理由不能将MPI_SendMPI_Isend 用于大消息或小消息。通常的问题是发送和接收调用没有正确匹配。如果事情适用于小消息而不适用于大消息,则尤其如此。
  • 短消息通过所谓的急切协议直接飞到目的地,无论是否已发布匹配的接收。较大的消息需要接收者和发送者之间进行一些交互,并且在双方匹配之前不会通过。也可能是您的网络配置错误(如果 rank 0 和 rank 1 位于物理上独立的机器上,并且在两者之间使用 TCP/IP)。
  • @WesleyBland 我只想将一个字符串从 0 级翻译到 1 级,例如,我想翻译“aaaaaaaaaaaaaaaaaa..”,如果 'a' 的装载是 1024,它可以工作,但是如果如果失败,'a' 的挂载为 1024000。谢谢。
  • @HristoIliev 是的,实际上 rank 0 和 rank 1 位于物理上独立的机器上,并且似乎使用了 TCP/IP。据我所知,MPI在翻译大数据时会使用Rendezvous protocal,但是我的集群并没有那么大,它包含一个分布式文件系统,只是一个NFS,所以我认为集群不支持大数据传输。 :(

标签: mpi openmpi


【解决方案1】:

FAQ 中描述了将 TCP/IP 与 Open MPI 结合使用的特性。我将尝试在这里给出一个执行摘要。

在利用网络接口进行数据交换时,Open MPI 使用了一种贪婪的方法。特别是,TCP/IP BTL(字节传输层)和 OOB(带外)组件tcp 将尝试使用具有匹配地址系列的所有已配置网络接口。在您的情况下,每个节点都有许多接口,地址来自 IPv4 地址系列:

comp01-mpi                     comp02-mpi
----------------------------------------------------------
eth0       192.168.0.101/24    eth0       192.168.0.102/24
eth0.2002  10.111.2.36/24      eth0.2002  10.111.2.37/24
eth1       192.168.1.101/24    eth1       192.168.1.102/24
eth2       10.111.1.36/23      eth2       10.111.1.37/23
lo         127.0.0.1/8         lo         127.0.0.1/8

Open MPI 假设comp02-mpi 上的每个接口都可以从comp01-mpi 上的任何接口访问,反之亦然。环回接口lo 绝不会出现这种情况,因此默认情况下,Open MPI 不包括lo。当必须传输信息时,网络套接字会延迟打开(例如按需)。

在您的情况下发生的情况是,在传输消息时,Open MPI 将它们分成片段,然后尝试通过不同的连接发送不同的片段以最大化带宽。默认情况下,片段大小为 128 KiB,仅包含 32768 个int 元素,第一个(急切的)片段大小为 64 KiB,并且包含的​​元素少两倍。可能会发生这样的假设:comp01-mpi 上的每个接口都可以从comp02-mpi 上的每个接口访问(反之亦然)是错误的,例如如果其中一些连接到单独的隔离网络。在这种情况下,库将被困在试图建立永远不会发生的连接并且程序将挂起。这通常应该发生在超过 16384 个int 元素的消息上。

为了防止上述情况,可以限制 Open MPI 用于 TCP/IP 通信的接口或网络。 btl_tcp_if_include MCA 参数可用于为库提供它应该使用的接口列表。 btl_tcp_if_exclude 可用于指示库要排除哪些接口。该选项默认设置为lo,如果想排除特定接口,则应明确将lo 添加到列表中。

以上所有内容也适用于用于传输特殊信息的带外通信。用于选择或取消选择 OOB 接口的参数是 oob_tcp_if_includeoob_tcp_if_exclude 反过来。这些通常与 BTL 参数一起设置。因此,您应该尝试将它们设置为实际有效的组合。首先将选择范围缩小到单个界面:

 mpiexec --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 ...

如果不能使用eth0,请尝试其他接口。

虚拟接口 eth0.2002 的存在将进一步混淆 Open MPI 1.6.2 和更高版本。

【讨论】:

    【解决方案2】:

    我认为,在从 rank=0 发送消息(在函数 MPI_Isend 中)时,您必须使用 text_length 而不是 text_length

    我相信您首先发送长度的原因是为了消除对数字进行硬编码的需要,那么为什么在发送到其他节点时要放置元素的数量?这可能是接收端不一致的原因。

    MPI_Isend 的签名是:

    int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
    

    其中count 是发送缓冲区中的元素数。如果count 大于数组长度,则可能会导致分段错误,或者如果count 小于数组长度,则可能会导致发送更少的元素。

    【讨论】:

    • Opps,实际上text_length和count的值都是360358。我确定数组足够大。
    猜你喜欢
    • 2011-03-03
    • 2020-01-18
    • 2013-01-13
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多