问题标签 [boost-mpi]
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_DOUBLE_COMPLEX` 用于`std::complex` 使用 Boost.MPI?
std::complex<double>
我想使用 Boost.MPI传输大量数字。在Boost.MPI 教程中解释说
为了获得不包含任何指针的小型固定长度数据类型的最佳性能,使用 Boost.MPI 和 Boost.Serialization 的类型特征标记它们非常重要。
已经讨论过不包含指针的固定长度类型可以用作 as
is_mpi_datatype
,例如:或等效的宏
的文档is_mpi_datatype
给出了另一个例子:
[...] 为此,首先将数据类型设为 Serializable(使用 Boost.Serialization 库);然后,专门化
is_mpi_datatype
该类型的特征,point
以便它derive mpl::true_
:
当我完全尝试优化性能 [在我下面的尝试中的选项 (A) 或 (B)] 时,我观察到 Boost.MPI 不使用内置 MPI 数据类型MPI_DOUBLE_COMPLEX
,也不映射到MPI_SUM
操作 [断言 (3) 和 ( 4)在我下面的尝试中]。此外,启用 (A) 或 (B) 之一以及禁用断言 (3) 和 (4) 会在运行时产生分段错误。
在Boost.MPI 的某些源文件中,我发现了一个名为的未记录(?)宏BOOST_MPI_DATATYPE
,它做正确的事情,但标有注释/// INTERNAL ONLY
。
在实现这个丑陋的 hack(?)之前,我想问一下:告诉 Boost.MPI 使用内置MPI_DOUBLE_COMPLEX
数据类型的预期方法是什么std::complex<double>
?
c++ - boost::iprobe 不返回正确的计数
在下面的代码中,在探测时,未获得正确的到达数。使用标准 MPI 函数也测试了相同的功能,并获得了正确答案。为什么 Boost 版本不能产生正确的结果?
增强版:
标准版本:
编辑:使用isend(dest, tag, values, n)
而不是isend(dest, tag, values)
给出正确答案n
数组中元素的数量在哪里。
boost - 如何在 Buildroot 下构建 Boost.MPI?
默认情况下,在 Buildroot 中交叉编译时包不会BR2_PACKAGE_BOOST_MPI
构建:它需要检测 MPI(例如 OpenMPI)配置和库,并且鉴于这不可能自动(在 buildroot 环境中),构建系统只会通知 Boost.MPI 获取跳过:bjam
在我的环境中,我可以通过修补来解决这个问题output/build/boost-1.61.0/user-config.jam
:
(第一行是user-config.jam
构建系统配置的唯一内容;我添加了第二行。此外,此处调整了路径)。
注意:我通过查看mpi.jam源和大量尝试错误获得了 bjam 行。
但是,任何干净的重建都会删除output/build
目录,从而擦除这些更改。
在使用 Buildroot 进行交叉编译时,是否有一种“正确”的方式来启用 Boost.MPI 的编译?或者至少,能够user-config.jam
在构建系统配置编译器后修补文件?(请注意,路径取决于我的系统配置和目标主机)。
c++ - 在并行环境中使用 boost::log
我用两个进程运行了以下代码。在输出中,只有一个条目。我每次都得到不同的排名。似乎每个进程都会覆盖文件。如何让所有进程在不覆盖的情况下记录消息?
预期结果(顺序可能不同):
实际结果:
代码:
c++ - 如何释放 boost::mpi::request?
我正试图让 MPI 断开一个通信器,这是一个易怒的业务 - 我在下面整理了一个演示。我有两个版本的相同想法,监听一个 int,一个使用 MPI_IRecv,一个使用 boost::mpi::request。
在此程序上使用 mpiexec -n 2 时,您会注意到版本 A 会愉快地断开连接并退出,但版本 B 不会。MPI_Request_free-ing 一个 boost::mpi::request 有什么技巧吗?这似乎就是这里的区别。如果重要的话,我正在使用 MSVC 和 MSMPI,以及 Boost 1.62。
我发现错误了吗?我怀疑我对代码很深。
c++ - MPI_Test:MPI_ERR_TRUNCATE
下面的代码给出了这个错误信息:
在抛出 'boost::exception_detail::clone_impl' 的实例后调用终止
what(): MPI_Test: MPI_ERR_TRUNCATE: 消息被截断
该问题可能与本文讨论的 boost::mpi 错误有关。我想确定错误的原因。
如果我只循环一次(for (int z=0; z<1; ++z)
),代码就可以工作,但是z<2
我得到了提到的错误消息。
c++ - 在 for 循环中处理复杂的 send recv 消息
我正在尝试将 C++ 中的生物模型与boost::mpi
. 这是我的第一次尝试,我对 boost 库完全陌生(我从 Schaling 的 Boost C++ Libraries 一书开始)。该模型由网格单元和居住在每个网格单元内的个人群组组成。这些类是嵌套的,这样一个向量Cohorts*
属于一个GridCell
。该模型运行了 1000 年,并且在每个时间步长上,存在分散,使得个体群体在网格单元之间随机移动。我想并行化 for 循环的内容,而不是循环本身,因为每个时间步都取决于前一次的状态。
我使用world.send()
andworld.recv()
将必要的信息从一个级别发送到另一个级别。因为有时在我使用的等级之间没有任何东西可以发送,mpi::status
并world.iprobe()
确保代码不会挂起等待从未发送过的消息(我按照本教程进行操作)
我的代码的第一部分似乎工作正常,但在继续执行 for 循环的下一步之前,我无法确保已收到所有发送的消息。事实上,我注意到一些队伍在其他队伍有时间发送他们的消息之前移动到下一个时间步长(或者至少从输出中看起来像这样)
我没有发布代码,因为它由几个类组成,而且很长。如果有兴趣,代码在github 上。我这里大致写了伪代码。我希望这足以理解这个问题。
我编译
并使用 执行mpirun -np 5 out
,但我希望稍后能够在 HPC 集群上使用更多内核执行(该模型将在全球范围内运行,单元的数量可能取决于选择的网格单元大小用户)。安装的编译器是 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, Open MPI: 2.1.1
c++ - 如何使用 mpi scatter 修复“矢量下标超出范围”?
问题在于我对 boost MPI 包装器如何工作的误解。我正在使用 Microsoft MPI 实现。在这段代码中,我试图分散std::vector
到进程但得到一个调试断言vector subscript out of range
错误。
这段代码是我使用 boost 包装器和 Microsoft MPI 实现超排序算法的引导程序。
我尝试了来自 boost 库的示例,但得到了相同的断言。我也尝试将两者都包括在内<vector>
,<boost/serialization/vector>
但没有帮助。我使用 boost 1.70 和最新版本的 Microsoft MPI 在 Windows 10 上运行我的程序。
qsort.hpp - qsort 算法的顺序实现
我希望通信器中的所有进程都有其未排序的列表。
我只能在调试构建中产生这个错误
c++17 - boost::mpi 和 boost:serialization 与 std::variant
c++17 引入了新类型std::variant
. 是否可以定义一个序列化例程,以便与std::variant
结合使用boost::mpi
?
例如,考虑一个简单的程序
它不编译给出错误
如何正确定义 a 的serialize
成员std::variant
?请注意,在上面的示例中,这两种类型A
都有B
一个正确定义的序列化成员。
c++ - 提升 mpi 非阻塞 + 层次聚集
我有一个使用 Visual C++ 和 Boost MPI 的多处理程序。每个过程都做它的一部分,最后,过程 0 收集所有结果并进行总结。下面是代码的摘录(poolsummary 是使用 Boost 序列化的类)
该程序仍然需要收集两个额外的类(我们称它们为 hist 和 rep)。
通常我使用 64 个处理器运行这个程序,这个收集部分有一个长尾。我认为有两种方法可以提高性能 1. 使用非阻塞聚集或其他东西 2. 将进程分组为 8 组(例如,进程 0 - 7 作为第 1 组,进程 8 - 15 作为第 2 组 ...);然后首先在每个组内进行一次收集,然后再收集组
如果这些解决方案有效,有人可以帮助我吗?如果没有,有哪些可能的方法来提高性能?是这样,这两个怎么实现?非常感谢您的宝贵时间。