我使用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
中的计数参数为360358
。 MPI
似乎太大了。当我设置参数1024
时,它运行良好。
实际上这个问题让我困惑了几天,我知道MPI
传输的数据大小有限制。但据我所知,MPI_Send
用于发送短消息,MPI_Isend
可以发送更大的消息。所以我使用MPI_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)
答案 0 :(得分:0)
我认为代替360358
,您必须在从rank = 0发送消息(在函数text_length
中)时使用MPI_Isend
。
我相信你首先发送长度的原因是为了消除对数字进行硬编码的需要,那么为什么在发送到其他节点时要放入元素的数量?这可能是接收端不一致的原因。
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
较少,则会导致发送较少的元素。
答案 1 :(得分:0)
在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
个元素,第一个(eager)片段的大小为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_include
和oob_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及更新版本。