gpt4 book ai didi

c - MPI - 发送和接收矩阵行

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

我正在制作程序,其中将使用 C 语言在 MPI 中进行 2-4 个进程。在消除中,我通过循环映射将实际行下方的每一行发送到不同的进程。

例如对于矩阵 5 * 6,当有事件的第 0 行和 4 个进程时,我将第 1 行发送到进程 1,第 2 行发送到进程 2,第 3 行发送到进程 3,第 4 行再次发送到进程 1。在这些进程中,我想进行一些计算并将一些值返回给进程 0,这会将这些添加到其原始矩阵中。我的问题是,我应该使用哪个 Send 和 Recv 调用?

有一些理论代码:

if(master){

for(...)
//sending values to other processes
}

for(...)
//recieving values from other processes
}
}else{//for other non-master processes
recieve value from master
doing some computing
sending value back to master

}

如果我只使用简单的阻塞发送,我不知道进程 1 会发生什么,因为它得到第 1 行和第 4 行,在我将在 master 中调用 recv 之前,我在进程 1 中的值 - 第 1 行将是被第 4 行覆盖,所以我会错过一组数据,对吗?因此,我的问题是,我应该使用哪种 MPI_Send?

最佳答案

如果 proc 1 可以在等待第 4 行的同时开始对第 1 行执行某些操作,那么您也许可以使用非阻塞。但是从阻塞开始也应该没问题。

算法中内置了很多同步功能。每个人都必须根据当前行工作。因此,接收进程将需要知道此过程的每次迭代需要多少工作。如果他们知道总行数以及他们当前正在处理的迭代,这很容易做到。因此,如果他们需要两行,他们可以执行两次阻塞 recvs,或启动 2 个非阻塞 recvs,等待一个,然后立即开始处理第一行。但可能最容易首先阻止工作。

您可能会发现即使在开始时让主进程执行 isends 也是有利的,这样所有发送都可以同时“启动”;然后 waitall 可以按任何顺序处理它们。

但比这种一对多通信更好的方法可能是使用 scatterv,这样可以更有效地进行。

在对这一系列问题的许多回答和评论中提出了一些问题,但我认为您从未真正解决过这些问题——我真的希望您只是为了教育目的而完成这个项目。当有像 Scalapack 这样经过调整和测试的工具时,实际实现您自己的并行线性代数求解器将是完全、完全、疯狂的。 , PETSc , 和 Plapack可以免费下载。

关于c - MPI - 发送和接收矩阵行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530168/

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