【问题标题】:The same named entity in PETSc and MPI - conflictPETSc 和 MPI 中的相同命名实体 - 冲突
【发布时间】:2017-05-09 17:05:54
【问题描述】:

我有一个使用 MPI 进行并行工作的现有 Fortran 代码。 我有兴趣添加一些 PETSc 求解器(特别是 KSP),但是当包含相关的 .h 或 .h90 文件(petsc、petscsys、petscksp 等)时,我遇到了与共享相同名称的变量的问题MPI 的。

即:

  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_DOUBLE_PRECISION]
  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_SUM]
  error #6405: The same named entity from different modules and/or program units cannot be referenced.   [MPI_COMM_WORLD]
and so on.

(使用 ics/composer_xe_2011_sp1.6.233 和 ics/impi/4.0.3.008 和 petsc 3.6.0,也尝试过旧的 petsc 版本 3.5.4)

所有这些都在 MPI 和 PETSc 中定义相同 - 有没有办法解决这个冲突并同时使用两者?

我会指出,我不想用 PETSc 调用替换 MPI 调用,因为代码应该有一个独立于 PETSc 运行的选项。

至于最小代码,清理大量代码显然是一个问题,所以我做了以下简单示例,其中包含相关部分:

program mpitest


implicit none
use mpi

! Try any of the following:
!!!#include "petsc.h"
!!!#include "petsc.h90"
!!!#include "petscsys.h"
! etc'


integer :: ierr, error
integer :: ni=256, nj=192, nk=256
integer :: i,j,k

real, allocatable :: phi(:,:,:)


integer :: mp_rank, mp_size
real :: sum_phi,max_div,max_div_final,sum_div_final,sum_div


  call mpi_init(ierr)
  call mpi_comm_rank(mpi_comm_world,mp_rank,ierr)
  call mpi_comm_size(mpi_comm_world,mp_size,ierr)




allocate(phi(nj,nk,0:ni/mp_size+1))

        sum_phi = 0.0
        do i=1,ni/mp_size
           do k=1,nk
              do j=1,nj
                 sum_phi = sum_phi + phi(j,k,i)
              enddo
           enddo
        enddo


sum_phi = sum_phi / real(ni/mp_size*nk*nj)
        call mpi_allreduce(sum_div,sum_div_final,1,mpi_double_precision,mpi_sum, &
             mpi_comm_world,ierr)
        call mpi_allreduce(max_div,max_div_final,1,mpi_double_precision,mpi_max, &
             mpi_comm_world,ierr)


call mpi_finalize(error)

deallocate(phi)


WRITE(*,*) 'Done'

end program mpitest

这在包含 PETSc 标头时直接发生,并且在删除包含时消失。

【问题讨论】:

  • 您可能不需要同时使用 fortran 和 fortran90 标签——只需要 fortran 就足够了(如果您确实需要fortran90 特定解决方案,那么您可能需要显示一些代码/解释原因)。请注意petscsys.h 有一个include <mpi.h> 行(L130),你大概也有?如果不是,那么我猜你在模块级别的某个地方有 include petscsys 行,并且在没有 only 限定符的地方有一个 use MODULENAME 语句,这意味着你再次引入这些定义。
  • 您真的应该尝试显示minimal reproducible example,以便我们可以弄清楚到底发生了什么。我之前评论中的建议只是出现这种情况的几种可能方式,因此显示您的代码至关重要。
  • 有不同的方面需要考虑,但我们确实需要一个更完整的例子来说明更多。可以考虑改名,或者modules can handle things.
  • 重命名和唯一可能会有所帮助,但您应该显示代码。把它当作一个讲座,如果你展示了重要的细节,你可能会在几分钟或一个小时内收到一个很好的答案......
  • @VladimirF,我很抱歉没有包括前面的示例,但这是由于极度缺乏时间,而不是缺乏必要的知识。

标签: fortran petsc


【解决方案1】:

好的,找到答案了:

PETSc 不太喜欢 Fortran,因此它的功能与使用 C/C++ 的方式不同,并且使用不同的定义。 对于 C/C++,可以使用 /include/petscXXX.h 中的标头,一切都会好起来的,而且层次结构已经包含依赖的 .h 文件(即包含 petscksp.h 将包含 petscsys.h、petscvec.h 等)。

不在 FORTRAN 中。

首先,对于 FORTRAN,需要在 /include/petsc/finclude/petscXXXdef.h 中包含标头(如果 PETSc 使用该标志编译,则为 .h90)。请注意,这些文件位于不同的包含文件夹中,并且是 petscxxxdef.h.

那么“使用 petscXXX”将与 MPI 一起工作而不会发生冲突。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多