标签: mpi

openMPI 中缺少 gethostname() 函数

由于 OpenFOAM 对 OpenMPI 的依赖,我不得不用 OpenMPI 替换 mpich2。

早些时候(使用 mpich2 时)在我的代码中,我使用 gethostname() 函数来获取机器的名称以进行调试。然而,这个函数似乎不是标准 MPI 函数,并且不再与 OpenMPI 库一起使用。OpenMPI 或 MPI 标准中还有其他获取主机名的函数吗?我使用 mpicc 进行编译,使用 mpirun 运行代码。

谢谢,

苏拉布

mpi

1
推荐指数
1
解决办法
4254
查看次数

MPI-reduce 运算中的求和顺序

我们知道,不同的浮点数求和顺序会导致不同的结果。

\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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

MPI 标准或 MPI 实现是否保证每次我们使用相同的输入和输出数据运行该函数时,结果都会相同?

\n\n

这就是我在文档中找到的

\n\n
\n

归约的 \xe2\x80\x98\xe2\x80\x98canonical\xe2\x80\x99\xe2\x80\x99 评估顺序由组中进程的排名决定。但是,实现可以利用关联性或关联性和交换性来更改计算顺序。

\n
\n\n

但这并没有提供任何关于可重复性的见解。

\n

c++ parallel-processing hpc mpi

1
推荐指数
1
解决办法
1179
查看次数

MPI_Bcast C++ STL 向量

为什么下面的代码不起作用?它适用于我的用户定义的类,但不适用于 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 作为一个整体?

c++ parallel-processing stl mpi

1
推荐指数
1
解决办法
1791
查看次数

无法使用 gfortran 打开模块文件

我正在使用 gfortran 运行 .F90 代码,但出现两个错误,

\n\n
program 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.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我检查了mpi安装库(系统中存在mpich、openmpi库)。

\n\n

程序如下:

\n\n
program 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)

fortran compiler-errors compilation mpi gfortran

1
推荐指数
1
解决办法
6620
查看次数

如何在 MPI 中将矩阵从一个进程传输到另一个进程?

我需要传递数据类型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)

c++ mpi parameter-passing

1
推荐指数
1
解决办法
771
查看次数

更新 (K)Ubuntu 18.04 到 20.04 后的 OpenMPI-bin 错误

我刚刚将我的 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)

它已被报道,但直到我写这个问题时才被修补。

经过一个多月的尝试各种方法来解决这个问题,我终于找到了解决方案,如下所示。希望对遇到同样问题的你有用。

ubuntu mpi openmpi

1
推荐指数
1
解决办法
1300
查看次数

在 HPC 上使用 mpi_send 而不是在我的笔记本电脑上时 Fortran 代码冻结

我有一个子例程,它应该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)

fortran mpi

1
推荐指数
1
解决办法
94
查看次数

在 MPI_Send 或 MPI_Ssend 之后立即调用 MPI_Finalize 是否安全?

假设我有 3 个节点,其等级为01212正在做一些计算,然后将结果传输到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?

parallel-processing ipc mpi openmpi

1
推荐指数
1
解决办法
452
查看次数

节点如何在 OpenMPI 中通信

我能够在ssh. 一切看起来都不错,但我发现我对真正发生的事情知之甚少。那么,节点如何在 OpenMPI 中通信?它在多个节点中,因此不能共享内存。它似乎也不是 TCP 或 UDP,因为我没有配置任何端口。谁能描述在 2 个节点的 2 个进程之间发送和接收消息时发生了什么?谢谢!

mpi openmpi mpi4py

1
推荐指数
1
解决办法
530
查看次数

通过带有 gfortran 的 mpi_f08 模块支持 MPI Fortran

我有一些 Fortran 代码,我想与 MPI 并行。显然,在 Fortran 中使用 MPI(在我的情况下为 MPICH)的推荐方法是通过mpi_f08模块(关于这个问题的 mpi-forum 条目),但我无法使它工作,因为根本没有创建相应的 mod 文件(与mpi.mod,它的工作原理不同)很好,但它不是最新的 Fortran 标准)。这个讨论给我留下的印象是 gfortran 无法构建 F08 绑定。您可以在下面看到我的配置,gfortran 和 mpich 都已通过 apt install 在 ubuntu 上安装,并且应该是最新的。我不确定一些事情:

  • 有什么方法可以使 Fortran 2008 MPI 语法与 gfortran 一起使用?从我遇到的情况来看,答案似乎是否定的,但希望有人可能知道解决方法。我对此不太精通,因此将不胜感激任何相关链接或更多入门级解释。
  • 可以使用不同的编译器帮助吗?英特尔编译器* 也许?如果合理,我宁愿坚持使用 gfortran。
  • 也许与当前标准的一致性并不是什么大问题。根据您的经验,通过 mpi.mod 模块获得支持会更好吗?那时我会遇到什么问题?我的应用程序没有太大的长远目标,所以如果它现在可以正常工作,那么一段时间后失去支持也不是什么大问题。

编辑

使用过时版本的 gfortran 似乎是个问题。这将我的问题简化为如何使用 gfortran-10 构建 MPICH。


* 因此 [intel-fortran] 标签,如果您认为它多余,请随意删除它

为了清楚起见,有我的 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)

fortran mpi gfortran fortran-iso-c-binding intel-fortran

1
推荐指数
1
解决办法
369
查看次数