传输大数据时无法运行MPI
我使用传输大数据时无法运行MPI,mpi,openmpi,Mpi,Openmpi,我使用MPI_Isend将字符数组传输到从属节点。当数组的大小很小时,它就工作了,但是当我放大数组的大小时,它就挂在那里了 在主节点上运行的代码(级别0): 在从属节点(排名1)上运行的代码: 您可以在MPI\u Isend中看到count参数是360358。对于MPI,它似乎太大了。当我设置参数1024时,它运行良好 事实上,这个问题已经困扰了我好几天了,我知道通过MPI传输的数据大小是有限制的。但据我所知,MPI_Send用于发送短消息,MPI_Isend可以发送更大的消息。所以我使用了MP
MPI_Isend
将字符数组传输到从属节点。当数组的大小很小时,它就工作了,但是当我放大数组的大小时,它就挂在那里了
在主节点上运行的代码(级别0):
在从属节点(排名1)上运行的代码:
您可以在MPI\u Isend
中看到count参数是360358
。对于MPI
,它似乎太大了。当我设置参数1024
时,它运行良好
事实上,这个问题已经困扰了我好几天了,我知道通过MPI
传输的数据大小是有限制的。但据我所知,MPI_Send
用于发送短消息,MPI_Isend
可以发送更大的消息。所以我使用了MPI\u Isend
秩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)
我认为,在从rank=0发送消息时(在函数
MPI\u Isend
中),必须使用text\u length
而不是360358
我相信,您首先发送长度的原因是为了消除硬编码数字的需要,那么为什么在发送到其他节点时要输入元素的数量呢?这可能是接收端不一致的原因
MPI_Isend的签名为:
int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
其中,
count
是发送缓冲区中的元素数。如果计数
大于数组长度,则可能会导致分段错误;如果计数
小于数组长度,则可能会导致发送较少的元素。在打开MPI的情况下使用TCP/IP的特性如中所述。我将尝试在这里给出一个执行摘要
OpenMPI在使用网络接口进行数据交换时使用贪婪的方法。特别是,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
元素的消息,通常会发生这种情况
为了防止上述情况,可以限制开放MPI用于TCP/IP通信的接口或网络。btl\u tcp\u if\u include
MCA参数可用于向库提供其应使用的接口列表。btl\u tcp\u if\u exclude
可用于指示库排除哪些接口。默认情况下,该接口设置为lo
,如果希望排除特定接口,则应明确将lo
添加到列表中
以上所有内容也适用于用于传输特殊信息的带外通信。选择或取消选择OOB接口的参数为OOB\u tcp\u(如果包含)
和OOB\u tcp\u(如果排除)
。这些参数通常与BTL参数一起设置。因此,您应该尝试将这些设置为实际工作的组合。首先将选择范围缩小到单个界面:
mpiexec --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 ...
如果它不适用于eth0
,请尝试其他接口
虚拟接口eth0.2002的出现将进一步混淆OpenMPI 1.6.2和更新版本。从您的问题来看,代码实际上在做什么还不清楚。你能给出一个最低限度的工作示例吗?()您没有理由不能对大消息或小消息使用
MPI_Send
或MPI_Isend
。通常问题是发送和接收呼叫不正确匹配。尤其是在小消息而不是大消息的情况下,情况更是如此。无论是否发布了匹配的接收,短消息都会通过所谓的急切协议直接飞到目的地。较大的消息需要接收者和发送者之间进行一些交互,并且在双方匹配之前无法通过。也可能是您的网络配置错误(如果秩0和秩1位于物理上不同的计算机上,并且在这两个计算机之间使用TCP/IP)。@WesleyBland我只想将一个字符串从秩0转换为秩1,例如,我想转换“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,如果失败了。谢谢。@HristoIliev是的,实际上秩0和秩1位于物理上不同的机器上,并且似乎使用了TCP/IP。据我所知,当MPI转换大数据时,它将使用Rendezvous协议,但我的群集并不是很大,它包含一个分布式文件系统,只是一个NFS,所以我认为群集不支持大数据传输(Opps,实际上text_length和count的值都是360358
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
mpiexec --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 ...