由于 OpenFOAM 对 OpenMPI 的依赖,我不得不用 OpenMPI 替换 mpich2。
早些时候(使用 mpich2 时)在我的代码中,我使用 gethostname() 函数来获取机器的名称以进行调试。然而,这个函数似乎不是标准 MPI 函数,并且不再与 OpenMPI 库一起使用。OpenMPI 或 MPI 标准中还有其他获取主机名的函数吗?我使用 mpicc 进行编译,使用 mpirun 运行代码。
谢谢,
苏拉布
我们知道,不同的浮点数求和顺序会导致不同的结果。
\n\n考虑使用 MPI_SUM 操作调用的 MPI 函数 MPI_reduce。
\n\n#include <mpi.h>\nint MPI_Reduce(const void *sendbuf, void *recvbuf, int count,\n MPI_Datatype datatype, MPI_Op op, int root,\n MPI_Comm comm)\nRun Code Online (Sandbox Code Playgroud)\n\nMPI 标准或 MPI 实现是否保证每次我们使用相同的输入和输出数据运行该函数时,结果都会相同?
\n\n这就是我在文档中找到的
\n\n\n\n\n归约的 \xe2\x80\x98\xe2\x80\x98canonical\xe2\x80\x99\xe2\x80\x99 评估顺序由组中进程的排名决定。但是,实现可以利用关联性或关联性和交换性来更改计算顺序。
\n
但这并没有提供任何关于可重复性的见解。
\n为什么下面的代码不起作用?它适用于我的用户定义的类,但不适用于 STL 矢量。
std::vector<int> v(4);
MPI_Bcast(&v, sizeof(v), MPI_BYTE, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
我遇到分段错误:
[sdg:13611] Signal: Segmentation fault (11)
[sdg:13611] Signal code: Address not mapped (1)
Run Code Online (Sandbox Code Playgroud)
由于向量中的元素是连续存储的,为什么我不能使用 MPI_BYTE 发送 std::vector 作为一个整体?
我正在使用 gfortran 运行 .F90 代码,但出现两个错误,
\n\nprogram fhello_world_mpi.F90\n 1\nError: Invalid form of PROGRAM statement at (1)\nfhello_world_mpi.F90:2:6:\n\n use mpi\n 1\n Fatal Error: Can\'t open module file \xe2\x80\x98mpi.mod\xe2\x80\x99 for reading at (1): \n No such file or directory\n compilation terminated.\nRun Code Online (Sandbox Code Playgroud)\n\n我检查了mpi安装库(系统中存在mpich、openmpi库)。
\n\n程序如下:
\n\nprogram fhello_world_mpi.F90\n use mpi\n implicit none\n integer ( kind = 4 ) error\n integer ( kind = 4 ) id\n integer p\n character(len=MPI_MAX_PROCESSOR_NAME) :: name\n integer clen\n integer, allocatable :: mype(:)\n real ( kind = 8 ) …Run Code Online (Sandbox Code Playgroud) 我需要传递数据类型vector<vector<int>>,但这不在 MPI 数据类型中。如何创建它?在这种情况下如何使用 MPI_Recv 和 MPI_Send?
这是我的代码算法(我安装了 8 个进程):
vector<vector<int>> p1, p2, p3, p4, p5, p6, p7; // our matrices
switch(WORLD_RANK) {
case 1: {
p1 = multiStrassen(summation(a11, a22), summation(b11, b22), n);
// send matrix p1
}
case 2: {
p2 = multiStrassen(summation(a21, a22), b11, n);
// send matrix p2
}
case 3: {
p3 = multiStrassen(a11, subtraction(b12, b22), n);
// send matrix p3
}
case 4: {
p4 = multiStrassen(a22, subtraction(b21, b11), n);
// send matrix p4 …Run Code Online (Sandbox Code Playgroud) 我刚刚将我的 Kubuntu 从 18.04 升级到 20.04。不幸的是,每次我使用 apt upgrade 或使用 apt 安装某些东西时,都会出现一个错误。错误是:
update-alternatives: error: /var/lib/dpkg/alternatives/mpi corrupt: slave link same as main link /usr/bin/mpicc
Run Code Online (Sandbox Code Playgroud)
它已被报道,但直到我写这个问题时才被修补。
经过一个多月的尝试各种方法来解决这个问题,我终于找到了解决方案,如下所示。希望对遇到同样问题的你有用。
我有一个子例程,它应该W % R使用MPI_SEND. 它可以在我的笔记本电脑上使用 Intel 和 gfortran 编译器(从某种意义上说它不会崩溃)。但是当我在 HPC 上运行它时,程序在第一次调用子例程时冻结。
SUBROUTINE mix_walkers( W )
include 'mpif.h'
TYPE(walkerList), INTENT(INOUT) :: W
INTEGER, SAVE :: calls = 0
INTEGER :: ierr, nthreads, rank, width, self, send, recv, sendFrstWlkr, sendLstWlkr, sendWlkrcount, &
recvFrstWlkr, recvlstWlkr, recvWlkrcount, status
calls = calls + 1
CALL MPI_COMM_SIZE( MPI_COMM_WORLD, nthreads, ierr )
CALL MPI_COMM_RANK ( MPI_COMM_WORLD, rank, ierr )
width = W % nwlkr / nthreads
IF( MODULO( calls, nthreads ) == 0 ) …Run Code Online (Sandbox Code Playgroud) 假设我有 3 个节点,其等级为0、1和2。1并2正在做一些计算,然后将结果传输到0. 调用 MPI_Send 或 MPI_Ssend,然后立即调用 MPI_Finalize,然后立即调用是否安全从 main 返回是否安全?
考虑这个例子:2钓鱼速度更快,将结果发送到0并最终确定。之后,0仍然1需要沟通,一旦1完成这是允许的 MPI“状态”吗?该标准反复声明,调用 MPI_Finalize 后,不得通过 MPI 进行通信。然而,如果这对所有节点都有效,而不仅仅是那些已经最终确定的节点,则似乎有点不切实际。
此外,我不清楚 MPI_Send 和 MPI_Ssend 调用是否安全,因为至少对于 MPI_Send 来说,调用可能会在0发布接收之前返回。如果此后立即调用 MPI_Finalize,并且某些内部缓冲区中仍有数据,会发生什么情况?这是否也适用于 MPI_Ssend?
我能够在ssh. 一切看起来都不错,但我发现我对真正发生的事情知之甚少。那么,节点如何在 OpenMPI 中通信?它在多个节点中,因此不能共享内存。它似乎也不是 TCP 或 UDP,因为我没有配置任何端口。谁能描述在 2 个节点的 2 个进程之间发送和接收消息时发生了什么?谢谢!
我有一些 Fortran 代码,我想与 MPI 并行。显然,在 Fortran 中使用 MPI(在我的情况下为 MPICH)的推荐方法是通过mpi_f08模块(关于这个问题的 mpi-forum 条目),但我无法使它工作,因为根本没有创建相应的 mod 文件(与mpi.mod,它的工作原理不同)很好,但它不是最新的 Fortran 标准)。这个讨论给我留下的印象是 gfortran 无法构建 F08 绑定。您可以在下面看到我的配置,gfortran 和 mpich 都已通过 apt install 在 ubuntu 上安装,并且应该是最新的。我不确定一些事情:
使用过时版本的 gfortran 似乎是个问题。这将我的问题简化为如何使用 gfortran-10 构建 MPICH。
为了清楚起见,有我的 gfortran 和 mpich 配置
pavel@pavel:~$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v …Run Code Online (Sandbox Code Playgroud)