没有针对MPI_CART_CREATE的特定子例程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有针对MPI_CART_CREATE的特定子例程相关的知识,希望对你有一定的参考价值。

我试图玩我的mpi实现的拓扑结构,但我使用MPI_CART_CREATE遇到错误。

示例Fortran代码

use mpi

implicit none
integer :: ierror, nproc, ring_comm

call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nproc, ierror)
call MPI_CART_CREATE(MPI_COMM_WORLD, 1, nproc, .false., 1, ring_comm, ierror)

call MPI_FINALIZE(ierror)

产生错误:

call MPI_CART_CREATE(MPI_COMM_WORLD, 1, nproc, .false., 1, ring_comm, ierror)
                                                                       1
Error: There is no specific subroutine for the generic 'mpi_cart_create' at (1)

我无法弄清楚为什么会产生这个错误,因为所有参考文件都表明这是正确的形式。为什么我会收到此错误?

答案

根据标准(并给出一个版本的here)子程序的绑定是

MPI_CART_CREATE(COMM_OLD, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERROR)
INTEGER COMM_OLD, NDIMS, DIMS(*), COMM_CART, IERROR
LOGICAL PERIODS(*), REORDER

问题中的代码使用

MPI_CART_CREATE(COMM_OLD, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERROR)
INTEGER COMM_OLD, NDIMS, DIMS, COMM_CART, REORDER, IERROR
LOGICAL PERIODS

所以:

  • reorder有一个错误的类型;
  • ndimsperiods是标量,而不是数组。
另一答案

看起来你没有在这里传递正确的参数。你可以找到这个功能的man page。我建议你去寻找一个很好的MPI拓扑教程,因为这是一个很大的答案。一个快速的谷歌搜索显示了不少,但这一个接近顶部和Fortran:http://scv.bu.edu/~kadin/Tutorials/Alliance/MPI/virtual_topology/cart_example2.html

以上是关于没有针对MPI_CART_CREATE的特定子例程的主要内容,如果未能解决你的问题,请参考以下文章

从 c++ 调用 FORTRAN 子例程会产生非法参数值

批处理脚本子例程:传递参数

模块化程序-子例程

仅在子例程中需要时才使用 Perl 模块

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数

如何将可分配数组传递给 Fortran 中的子例程