问题标签 [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.
mpi - MPI_Win_fence 挂起
我已经使用 MPI 为特定应用程序实现了一种分布式数组。我尝试使用 RMA (MPI_Get) 来获取由其他进程负责的数组部分的更新值。我们已经完成了教程中指定的操作: MPI_Win_create MPI_Win_fence 一堆 MPI_Get(每个进程大约 8.000) MPI_Win_fence
问题是所有进程都挂在第二个 MPI_Win_fence 并且永远不会返回。任何人都可以提供一些帮助吗?MPI_Get的数量有问题吗?
问候, 阿德尼尔索
c - 使用 MPI_Put 的异步有限差分方案
Donzis & Aditya 的一篇论文表明,可以使用可能在模板中有延迟的有限差分方案。这是什么意思?FD 方案可用于求解热方程并读取(或对其进行一些简化)
意思是,下一个时间步的值取决于上一个时间步的相同位置及其邻居的值。
通过将(在我们的案例中为一维)域拆分到不同的处理器上,可以轻松解决这个问题。但是,在处理器上计算边界节点时,我们需要通信,因为该元素u[t,i+-1]
仅在另一个处理器上可用。
下图说明了该问题,该图取自引用的论文。
MPI 实现可能使用MPI_Send
和MPI_Recv
进行同步计算。由于计算本身相当容易,因此通信可能会成为瓶颈。
论文中给出了该问题的解决方案:
而不是同步过程,只需使用可用的边界注释,尽管它可能是较早时间步的值。然后该方法仍然收敛(在某些假设下)
对于我的工作,我想实现异步 MPI 案例(这不是论文的一部分)。同步部分使用MPI_Send
并且MPI_Recv
工作正常。我将内存扩展了两个元素作为相邻元素的幽灵单元,并通过发送和接收发送所需的值。下面的代码基本上是上图的实现,在计算前的每个时间步执行。
现在,我绝不是 MPI 专家。我想通了,这MPI_Put
可能是我需要的异步案例和阅读一点点,我想出了以下实现。
在时间循环之前:
在时间循环内:
它将所需的元素放在窗口中,即boundary
(具有两个元素的数组)放在相邻的处理器上,u[0]
并u[NpP+1]
从boundary
数组本身获取值。这个实现是有效的,我得到的结果与MPI_Send/Recv
. 但是,这并不是真正的异步,因为我仍在使用MPI_Win_fence
,据我了解,这确保了同步。
问题是:如果我取出MPI_Win_fence
里面的值boundary
永远不会更新并保持初始值。我的理解是,如果没有您,将采用其中可能(或可能不会)已由相邻处理器更新的MPI_Win_fence
任何可用值。boundary
有没有人知道在MPI_Win_fence
解决问题的同时避免使用内部的值boundary
永远不会更新?
我也不确定我提供的代码是否足以理解我的问题或给出任何提示。如果是这种情况,请随时询问,因为我会尝试添加所有缺少的部分。
c - MPI_Put 用于分布式数据
我正在尝试使用 MPI-2 功能进行单向通信来编写分布式哈希表程序。每个进程在开始时都会向所有其他进程公开一个内存 (B)。然后,希望每个进程可以在不同步的情况下访问对方的内存。到目前为止,我所拥有的如下所示(来自示例http://mpi.deino.net/mpi_functions/MPI_Put.html的修改代码)。最后,在某些情况下,我得到了错误的 B[99] 值(因运行而异)。我究竟做错了什么?
编辑:我现在通过最后的等待调用解决了上述问题,但我想等待每个 MPI_Get 调用完成。但看起来唯一的选择是需要全局同步的 MPI_Win_fence,或者每个 MPI_Get 调用的 MPI_Win_start/MPI_Win_complete。是否可以如下所示调用后者一次,并在每次 MPI_Get 调用后以某种方式等待?
mpi - 如何检查 MPI 单向通信是否完成?
我正在使用MPI_Raccumulate
具有预定义聚合功能的从源到目的地的单向通信功能。
我想在MPI_Raccumulate
程序结束时检查所有呼叫是否已完成(发送方发送数据,接收方成功接收数据)。MPI_Wait
但是,似乎不是解决这个问题的方法;它只等待检查源缓冲区是否可更新(用户可用)。
有没有办法(1)检查一个特定的 MPI 单侧通信调用是否已完全完成(在发送方和接收方)?(2) 确认每个处理器中没有发送/接收 MPI 请求?
我的应用程序应该使用单向通信,但需要确认在特定任务结束时没有更多通信。
谢谢
mpi - MPI 远程访问内存
关于 MPI 3.0 中的 Remote Access Memory,有两种通信调用:MPI_Put 和 MPI_Get。我使用以下内容将本地数据放入共享内存(为了说明,我从https://software.intel.com/en-us/blogs/2014/08/06/one-side-communication复制了一些语句):
这里 num_procs 是处理器的数量,id 是处理器等级。它们分别从以下位置返回:
在 MPI_Put 之后,来自每个处理器的数据应该被放入共享内存中。然后我的代码想使用从这个共享内存中获取数据
我的问题是:我是否可以运行 NUM_ELEMENT_get 与 NUM_ELEMENT 不同的案例?这意味着与它们发送的数据相比,相同的处理器将从共享内存中获取不同数量的数据。另一个问题是单个处理器获得的数据可能来自不同的处理器。那么如何在上面的 MPI_Get 调用中指定 id-1 和 num_procs-1 的参数呢?我没有尝试实现这一点,但正在考虑在我的代码中设计 MPI 实现。
太感谢了。
mpi - MPI:MPI_Get 不工作
以下代码在进程 0(主)中创建一个窗口,其他进程在其中放入一些值,我每次都试图从其他进程中获取主窗口来打印它,但我得到的结果完全令人困惑。这是代码:
这实际上给了我以下结果:
你能帮我弄清楚我的代码有什么问题吗?谢谢。
编辑:显然问题是 MPI_Get 没有填充“本地”缓冲区......
mpi - MPI:如何正确使用 MPI_Win_allocate_shared
我想在进程之间使用共享内存。我尝试了 MPI_Win_allocate_shared 但是当我执行程序时它给了我一个奇怪的错误:
./src/mpid/ch3/include/mpid_rma_shm.h
第 592 行的文件中的断言失败:local_target_rank >= 0
internal ABORT
这是我的来源:
我得到以下结果:
有人可以帮我找出问题所在以及该错误的含义吗?非常感谢。
algorithm - MPI:确保对共享内存 (RMA) 的独占访问
我想知道在 MPI 中的 n 个进程之间确保对共享资源(例如内存窗口)的独占访问的最佳方法是什么。我已经尝试过 MPI_Win_lock 和 MPI_Win_fence 但它们似乎没有按预期工作,即:我可以看到多个进程同时进入一个关键区域(MPI_Win_lock 和 MPI_Win_unlock 之间包含 MPI_Get 和/或 MPI_Put 的代码)。
我会很感激你的建议。谢谢。
c++ - 主线程可以为所有线程调用一次 MPI_Win_lock_all() 吗?
我正在编写具有 MPI-3 远程内存访问功能的混合 MPI/OpenMP 代码。我假设 MPI_THREAD_SERIALIZED 可用。
我可以这样做吗?
这里主线程对整个 MPI 进程调用一次 lock 和 unlock。OMP 线程在需要时调用 MPI_Get。我可以为每个 MPI_Get 调用 lock 和 unlock,但是,我认为这需要更多时间。
似乎在工作。但是,我不确定这是否正确使用。
mpi - MPI_Win_attach 可以附加多少内存的实际限制是什么?
我注意到 MPI 3.1 标准中的这些位:
给用户的建议。将内存附加到窗口可能需要使用稀缺资源;因此,不建议在可移植程序中附加大的内存区域。
给实施者的建议。高质量的实现将尝试使尽可能多的内存可用于附加。
我已经查看了来自各种实现(即 MPICH、Cray MPICH、OpenMPI、SGI MPT 和 Intel MPI)的 MPI_Win_attach 的手册页,并且没有看到这些实现对内存量的任何记录限制可以附加内存。我应该不要太担心这里给出的“给用户的建议”吗?