我正在尝试进行无序的一对一通信。基本上我有多个相同大小的浮点数组,由整数 id 标识。
每条消息应如下所示:
<int id><float array data>
在接收方,它确切地知道有多少个数组,因此设置了准确的 recv 数量。收到消息后,它会解析 id 并将数据放入正确的位置。问题是消息可以从任何其他进程发送到接收进程。(例如,生产者有一个工作队列结构,并处理队列中可用的任何 id。)
由于 MPI 只保证 P2P 的订单交付,我不能轻易地将整数 id 和 FP 数据放在两条消息中,否则接收方可能无法将 id 与数据匹配。MPI 也不允许一次发送两种类型的数据。
我只能想到两种方法。
1) Receiver 有一个大小为 m (source[m]) 的数组,m 是发送节点的数量。发送者首先发送 id,然后是数据。接收者收到来自发送者 i 的整数消息后,将 id 保存到 source[i]。从发送者 i 接收到 FP 数组后,它会检查 source[i],获取 id,并将数据移动到正确的位置。它之所以有效,是因为 MPI 保证了有序的 P2P 通信。它要求接收者保存每个发送者的状态信息。更糟糕的是,如果单个发送进程可以在数据之前发送两个 id(例如多线程),则此机制将不起作用。
2)把id和FP当作字节,复制到发送缓冲区。将它们作为 MPI_CHAR 发送,接收器将它们转换回整数和 FP 数组。然后我需要支付将内容复制到发送方字节缓冲区的额外费用。随着 MPI 进程中线程数量的增加,总临时缓冲区也会增加。
它们都不是完美的解决方案。我不想在进程中锁定任何东西。我想知道你们中是否有人有更好的建议。
编辑:代码将在具有 infiniband 的共享集群上运行。机器将随机分配。所以我认为 TCP 套接字在这里不能帮助我。此外,IPoIB 看起来很昂贵。我确实需要完整的 40Gbps 通信速度,并让 CPU 进行计算。