问题标签 [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.
c++ - MPI_Win_allocate() 不返回
当我运行以下代码时,mpirun -n 2 ./out
它可以正常工作,但mpirun -n 3 ./out
MPI_Win_allocate()
不会返回。我在之前和之后打印到屏幕上检查了这一点MPI_Win_allocate()
。另外,如果我注释掉MPI_Bcast()
代码有效。问题是什么?
编辑:将增强功能更改为标准功能以简化问题。
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?
如果我将值更改assert
为MPI_MODE_NOCHECK
它似乎工作
第二个问题:
为什么它与MPI_MODE_NOCHECK
根据文档,我认为这意味着必须以不同的方式组织互斥。有人可以解释文档中的段落MPI_Win_lock_all()
吗?
MPI_MODE_NOCHECK
当调用者持有窗口锁时,没有其他进程持有或将尝试获取冲突锁。当通过其他方式实现互斥时,这很有用,但仍需要可能附加到 lock 和 unlock 调用的一致性操作。
提前致谢!
示例程序:
使用以下 Makefile 编译:
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 实现的错误还是我做错了什么
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 缓冲区创建另一个通信器和另一个窗口,所以最后只是切换行的顺序并没有帮助。
我将非常感谢任何帮助找出我做错了什么。
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)我如何让它工作?这只是我自己的一个教育例子,而我真正需要做的事情要复杂得多。