问题标签 [mpi-rma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
64 浏览

c++ - MPI_Win_allocate() 不返回

当我运行以下代码时,mpirun -n 2 ./out它可以正常工作,但mpirun -n 3 ./out MPI_Win_allocate()不会返回。我在之前和之后打印到屏幕上检查了这一点MPI_Win_allocate()。另外,如果我注释掉MPI_Bcast()代码有效。问题是什么?

编辑:将增强功能更改为标准功能以简化问题。

0 投票
1 回答
555 浏览

c - MPI_Fetch_and_op 的一致性

我试图通过一个小例子来理解 MPI-Function `MPI_Fetch_and_op() 并遇到了我想理解的奇怪行为。

在该示例中,等级为 0 的进程正在等待,直到进程 1..4 各自将 result 的值加一,然后再继续。

0在函数中使用 assert的默认值时,MPI_Win_lock_all()有时(10 次中有 1 次)会出现无限循环,即将result[0]MASTER 中的值更新为 3。终端输出类似于以下代码片段:

根据文档,功能 MPI_Fetch_and_op 是原子的。

此操作相对于其他“累积”操作是原子的。

第一个问题: 为什么不将 的值更新result[0]为 4?


如果我将值更改assertMPI_MODE_NOCHECK它似乎工作

第二个问题: 为什么它与MPI_MODE_NOCHECK

根据文档,我认为这意味着必须以不同的方式组织互斥。有人可以解释文档中的段落MPI_Win_lock_all()吗?

MPI_MODE_NOCHECK

当调用者持有窗口锁时,没有其他进程持有或将尝试获取冲突锁。当通过其他方式实现互斥时,这很有用,但仍需要可能附加到 lock 和 unlock 调用的一致性操作。

提前致谢!

示例程序:

使用以下 Makefile 编译:

0 投票
0 回答
293 浏览

fortran - MPI_WIN_ALLOCATE_SHARED 和同步

我尝试做一个 mpi 共享内存示例,但每次我得到一些奇怪的值。

它是一个 1D 模板,只是对位置 i-1、i 和 i+1 处的元素求和

我在 32 MPI 进程的 2 个节点上运行此程序,并且域大小 nx=64,每个等级的域只有 1 个元素。我用 MPI_SENDRECEIVE 和幽灵单元在节点之间进行交换

多次迭代后的值必须等于秩

但是当我运行它时,错误的值开始出现(如 -6.018996517484083E+196 )

由于我是 MPI RMA 的新手,我不知道这是我使用的 MPI 实现的错误还是我做错了什么

0 投票
0 回答
254 浏览

c - 使用 MPI_Win_create() 和 MPI_Get() 函数时的问题

在 MPI (MPICH) 中,我正在尝试使用 Windows。我有一个 3D 网格拓扑和额外的通信器 i_comm。

然后我创建窗口,然后尝试使用 get 函数

使用此代码,我得到很长的错误输出:

此外,如果不使用 MPI_Win_fence,我会在 get 函数中遇到错误:MPI_ERR_RMA_SYNC: error execution rma sync。我不确定这是否正常。

我观察到的是,如果我以相反的顺序声明数组,那么它可以正常工作:

问题是我需要为 PA 缓冲区创建另一个通信器和另一个窗口,所以最后只是切换行的顺序并没有帮助。

我将非常感谢任何帮助找出我做错了什么。

0 投票
1 回答
142 浏览

fortran - 在fortran中使用MPI_PUT,不同等级使用c_loc有不同的位移

我将 MPI 等级分开以计算数组的不同部分,然后我想将这些切片放置/发送到不参与计算的不同等级上。该等级是新通信器的主人,该通信器设置为对数组执行其他操作(平均、IO 等)。我让它与 MPI_isend 和 MPI_irecv 一起工作,现在我想尝试 MPI_Put。

我已经! if (.not.allocated(diag_comm)) then注释掉了,因为我尝试对所有计算 r 的排名进行此操作,但我得到了相同的结果。我在我的 Makefile 中编译mpiifort -O0 -fpe0 -init=snan,arrays -no-wrap-margin -traceback -stand f18和运行。mpirun -n 12 ./$@.x : -n 6 ./$@.x我正在使用的 mpiifort 版本是

输出 ( write (6,*) loc_base, grk) 很奇怪。

排名 12-17 是不参与“计算 r”的排名,但我不确定为什么c_loc(r(1,1))这些排名不同。此外,等级 0 也不同。

我的实际问题是

1)如何计算displacement变量?我做得对吗?等级之间是否应该有所不同,因为在这种情况下会有所不同?

2) 为什么c_loc(r(1,1))12-17 的排名不同?这与这是一个 SPMD 程序有关吗?为什么等级 0 不同?

3)我可以与所有队伍进行单向沟通而不是只与一个队伍沟通吗?我让每个等级调用 mpi_isend,然后当我以另一种方式执行此操作时,我只是在所有等级发送中循环调用 mpi_irecv。我可以用 MPI_Put 做类似的事情吗?我应该使用 MPI_Get 吗?还有什么?

4)我如何让它工作?这只是我自己的一个教育例子,而我真正需要做的事情要复杂得多。