问题标签 [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 投票
4 回答
3742 浏览

c++ - 创建一个在 MPI 进程之间保持同步的计数器

我在使用基本的 comm 和 group MPI2 方法方面有相当多的经验,并且使用 MPI 做了很多令人尴尬的并行模拟工作。到目前为止,我已经将我的代码结构化为有一个调度节点和一堆工作节点。调度节点具有将与模拟器一起运行的参数文件列表。它使用参数文件为每个工作节点播种。工作节点运行它们的模拟,然后请求调度节点提供的另一个参数文件。运行所有参数文件后,调度节点会关闭每个工作节点,然后再自行关闭。

参数文件通常命名为“Par_N.txt”,其中 N 是标识整数(例如,N = 1-1000)。所以我在想,如果我可以创建一个计数器,并且可以让这个计数器在我的所有节点之间同步,我就可以消除对调度节点的需求,并使系统更简单一些。理论上这听起来很简单,但实际上我怀疑它有点困难,因为我需要确保计数器在更改时被锁定,等等。并且认为 MPI 可能有一种内置方式处理这个(事情。有什么想法吗?我是不是想太多了?

0 投票
1 回答
171 浏览

performance - 与 MPI-2 的单面通信

考虑以下 OpenMP 代码片段,它使用中间共享变量在两个线程之间传输私有数据

我将(在伪代码中)需要使用单面消息传递库将私有数据从一个进程传输到另一个进程。有任何想法吗?

0 投票
1 回答
1191 浏览

fortran - 使用 MPI-2 的 RMA 函数的 Fortran 程序中的分段错误

只要包含 MPI_GET 调用,以下简短的 Fortran90 程序就会崩溃。Rank 1 尝试从 rank 0 中读取一个值并在 MPI_WIN_UNLOCK 中挂起。等级 0 尝试在 MPI_BARRIER 中崩溃并出现分段错误。

我反复检查命令的语法,但它们似乎是正确的。C/C++ 中的类似代码在同一系统上工作。

我正在使用 OpenMPI 1.4.3 和 gfortran 4.4.5。

0 投票
1 回答
274 浏览

mpi - MPI RMA 为多维数组中的幽灵单元创建窗口

如果我有一个数组 A[100][100][100],我如何为六个边缘子数组(幽灵单元)创建一个远程内存访问窗口,尤其是 A[0][:][:] 和 A[100 ][:][:]。在 MPI-1 中,我创建了向量类型来发送/接收幽灵单元。在 MPI-2 和 -3 中,我需要暴露整个阵列还是只暴露幽灵单元?当然,如果可能的话,后者会好得多。

0 投票
2 回答
428 浏览

synchronization - 在 MPI 中,为错误消息锁定标准输出

当满足错误条件时,我的程序可以在某些 MPI 等级上生成错误消息。但是,可能仅在某些(但不是全部)等级上满足此条件。我想从遇到错误情况的第一个等级输出一条消息,并从其他等级中丢弃类似的消息。

如果我天真地这样做(没有丢弃消息),例如

我会在屏幕上得到随机排序的输出。

我想为进入该if(error)块的第一个进程锁定标准输出,这很复杂,因为并非所有进程都进入该块。这意味着,一个 MPI_Barrier() 集合不会完成。仅将所有输出发送到一个处理器并不是真正的解决方案,因为这将需要在代码中可能生成错误消息的每个位置进行同步,从而减慢程序的速度。仅出于打印消息的目的而设置空闲处理器似乎也没有吸引力(这是用于社区代码)。至少,如果有许多等级,每个等级写入一个文件也不是一种选择。

我想知道 MPI 中是否有原子机制(我在 MPI3 中读过它),以便我可以原子地更新一个处理器内存中的标志,例如通过单边通信,并且仅在出现错误消息时继续打印错误消息标志尚未设置。

恐怕这不能用标准技巧轻松完成......我是对的吗?

更新:

我想我知道该怎么做了。Wesley 的回答很接近,但也可以使用标准 MPI2 RMA 来完成,该 RMA 在大多数 MPI 实现中都可用。解决方案的关键可以在 Using MPI2 一书中的 atomic example 中找到,其代码也在 MPICH2 发行版中 (test/mpi/rma/fetchandadd.c)

以下是您如何锁定和自动递增变量(存在于 0 级):

在初始化期间的某个地方:

...在退出之前

0 投票
1 回答
159 浏览

fortran - 从另一个处理器调用变量

我正在用 Fortran77 编写一个并行程序。我有以下问题:

  1. 我有 N 个处理器。
  2. 每个处理器包含一个大小为 S 的数组 A。
  3. 使用某个函数,在每个处理器上(比如 X 级),我计算两个整数 Y 和 Z 的值,其中 Z < S(Y 和 Z 的值在每个处理器上都不同)。
  4. 我想将处理器 Y 上的 A(Z) 的值传递给处理器 X。

我想首先将数值 X 从处理器 X 发送到处理器 Y,然后将 A(Z) 从处理器 Y 发送到处理器 X。但这是不可能的,因为处理器 Y 不知道数值 X,所以它不会知道从哪个处理器接收数值 X。

我试过了,但我还没有想出任何可以实现这个动作的代码。所以我没有发布任何代码。

编辑:

我将尝试用一个例子来解释它。假设我在处理器 X=(比如 2)上。在处理器 2 上,我计算两个整数的值,Y=(比如 34)和 Z=比如(5)。我想在处理器 34 上使用 A(5) 的值在处理器 2 上进行计算。我该怎么做?

编辑:

MPI 论坛上的某个人给了我这段代码,它非常清楚地说明了 mpi_get 的使用:

0 投票
1 回答
688 浏览

c++ - MPI2 / MPI3:考虑同步的 MPI_allgather 与 MPI 单侧通信

我正在使用 MPI-2 编写一个优化程序,其中我需要在所有进程之间共享一个std::vector相等长度std::vector的 s(从概念上讲)。该向量包含k 当前找到的问题的最佳解决方案,并且每次通过许多 MPI 进程之一找到新的最佳解决方案时都会更新。每个过程花费在寻找新解决方案上的时间通常差别很大。

我的问题是,考虑到同步和等待中的性能问题,是否应该使用 MPI 集合,例如MPI_allgather每次找到新的最佳解决方案时;或者我应该在 MPI-2 中使用 One-Sided-Communications 来维护所有进程之间的“共享”向量。

特别是,如果我使用MPI_allgather,进程是否会提前完成工作并等待与其他进程的某种同步?

我在 MPI 点对点通信(更新:以及 UPC)方面有一些工作经验,但在实际编码中没有使用集体或单方面的通信。我搜索了 SO 并找到了有关 MPI_allgathers 的相关问题/答案,例如使用 MPI_Allgather 分发结构,以及关于单向通信创建一个在 MPI 进程之间保持同步的计数器。但是我很难说出这两种方法之间的确切区别。

谢谢,

- - 更新 - -

特别是,我在底部有来自创建一个在 MPI 进程之间保持同步的计数器的代码示例,它使用单面来维护一个单一的int“共享”。我试图将其调整为适用于泛型类型,但不知道如何使其工作,因为我无法理解原始代码以及它为什么维护一个数组data,以及我如何推广MPI_Accumulate到用户函数(比如简单地替换旧向量与新向量)。

template //注意:T 只能是原始类型(不能是指针、引用或结构),例如 int 和 double。struct mpi_array { typedef std::vector 向量;MPI_Win 获胜;int 主机等级;
国际排名;
整数大小;
向量值;
向量 *hostvals; };


单面通讯计数器代码:

0 投票
1 回答
461 浏览

c++ - 如何在 MPI-2+ 中复制 MPI_Accumulate 的功能

我正在学习 MPI-2/MPI-3 中引入的 MPI 单面通信,并遇到了这个在线课程页面MPI_Accumulate

MPI_Accumulate 允许调用者将移动到目标进程的数据与已经存在的数据结合起来,例如在目标进程中累积总和。通过使用 MPI_Get 检索数据(随后是同步)可以实现相同的功能;在调用者处执行求和运算;然后使用 MPI_Put 将更新的数据发送回目标进程。积累简化了这种混乱......

但是只有有限数量的操作允许与MPI_Accumulate(max、min、sum、product 等)一起使用,并且不允许用户定义的操作。我想知道如何实现上面提到的混乱,使用MPI_Get、同步、操作和MPI_Put. 是否有任何 C/C++ 教程或工作代码示例?

谢谢


为了测试,我改编了这个SO question中的一段代码,其中使用单面通信来创建一个整数计数器,该计数器在 MPI 进程中保持同步。使用的目标问题行MPI_Accumulate已标记。

代码按原样编译并在大约 15 秒内返回。但是当我尝试用MPI_Accumulate问题行之后的注释块中所示的等效基本操作序列替换时,编译的程序无限期挂起。

谁能帮忙解释一下出了什么问题,MPI_Accumulate在这种情况下正确的替换方法是什么?

PS我编译了代码

并执行二进制文件


代码:

还有一个问题,我应该MPI_Win_fence在这里使用而不是锁吗?

- 编辑 -

increment_counter我按如下方式使用锁定/解锁,程序运行但行为奇怪。在最终的打印输出中,主节点完成所有工作。还是一头雾水。

0 投票
1 回答
174 浏览

c++ - 同步 MPI-2 单侧通信的顺序问题

我正在学习 MPI-2 并尝试使用 MPI-2 单面通信来实现第一个简单的功能:

让进程 0 托管一个固定大小的数组data_size

每个进程(包括0)都会生成一个数组并与宿主数组进行比较:

如果生成数组的第一个元素小于宿主数组的第一个元素,则将宿主数组替换为生成的数组。

在代码中:

完整的代码在底部。当然,我希望在所有生成的数组中,具有最小头元素的数组最终应该在程序完成时出现在主机数组中,因为最小的数组(本例中为 [0,1,2])将替换其他数组并且不会自行更换。

但是,在某些(罕见的)场合,我得到了这样的输出:

,这似乎表明同时对主机数据进行了两次分配。我想我一定是误解了其中的锁定/解锁同步指令,get_vec/putvec或者在其他地方犯了一些明显的错误。

有人可以解释一下我应该如何修复我的代码以获得预期的输出吗?

提前致谢。


使用以下代码编译的完整代码g++ -std=c++11 test.cpp -lmpi

0 投票
1 回答
91 浏览

c++ - 将单个 int 值与 MPI-2 单侧通信同步的问题

在学习 MPI-2 单向通信的(一系列)尝试中,我正在测试以下代码,其中我将一个基本类型值存储int在主进程中,并将其公开给所有其他进程。现在我对整数所做的事情很简单。我让每个进程迭代地递增它,直到共享整数达到最大值。每个进程都会在打印出共享整数之前进行隔离,如下所示(完整代码在底部):

我希望每个进程25在退出时都会打印相同的值 ()。但我有时会得到这样的输出:

有人可以解释一下这里发生了什么以及如何正确同步它吗?

谢谢,


代码: