gpt4 book ai didi

c++ - mpi All-to-All Scatter/Gather的高效实现

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:13 57 4
gpt4 key购买 nike

我的每个进程都有一个值数组 v 和一个大小相同的进程 ID pid 数组。 pid[i] 指定要将项目 v[i] 发送到哪个进程。

我需要实现一个分散操作(当然还有相应的聚集操作)。
进程 ID 数组很可能只包含(但不完全)相邻进程(在笛卡尔拓扑的意义上),并且大多数时候只包含它自己的进程 ID。 (MPI_Comm_rank() 返回的那个)。此外, map 仅初始化一次,并且在我的整个计算过程中保持不变,而分散/聚集操作经常被调用。

我自己的实现已经进行到一半了,从一些值开始,这样相邻的元素被发送到同一个进程,然后是很多 ISend 和 IRecv。现在我遇到了 MPI_Alltoallv 函数,我想知道我是用自己的编码更好还是应该使用 MPI 内部函数。有人对此有经验吗?

最佳答案

如果您知道您的进程将始终以特定拓扑结构进行通信,那么真正可以减少您需要发送的消息数量的方法之一就是邻居集体。我不会在这里介绍整个教程,但基本思想是您向 MPI 提供拓扑信息,然后使用特殊的集合函数进行通信。特殊功能是:

MPI_NEIGHBOR_ALLGATHER(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
MPI_NEIGHBOR_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm)
MPI_NEIGHBOR_ALLTOALL(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
MPI_NEIGHBOR_ALLTOALLV(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, rdispls, recvtype, comm)
MPI_NEIGHBOR_ALLTOALLW(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, rdispls, recvtypes, comm)

加上所有的非阻塞变体。通过使用这些,您不必编写自己的集体函数。您可以只使用 MPI 的内置内容,这些内容将得到更好的优化和更易于阅读。

关于c++ - mpi All-to-All Scatter/Gather的高效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126215/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com