所以我试图并行化一个我使用MPI的Fortran 2003程序。我使用共享内存的64Gb在16个处理器核心的节点上运行它。我的MPI通信器中的16个等级必须将一些算法应用于相当大的阵列(约6000×8000个元素,双精度)的一部分。编译时未定义mpi_win_allocate_shared的符号
现在,我使用MPI_BCAST
将这个数组的副本从根级别发送到另外15个级别,这需要很多时间。大数组是只读的,所以我认为使用MPI_win_allocate_shared
开放阅读所有级别并且传递win对象会更快。由于它是一个共享内存节点,所以应该可以正常工作。 (所有基于我在回答中找到这个主题的解释:MPI Fortran code: how to share data on node via openMP?)
然而,当我试图编译程序时,我收到以下错误信息:
Undefined symbols for architecture x86_64:
"_mpi_win_allocate_shared_", referenced from:
___lakefinder_parallel_mpi_nam_module3_MOD_fill_sea_master in lakefinder_parallel_mpi_nam_module3.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
没有一个线索,为什么,因为该程序使用了其他几个MPI命令(MPI_INIT,MPI_SEND,MPI_BCAST等),并且它可以正常工作。
任何想法?
这里是基本的代码,我有(只有相关的作品,这是一个大的气候模型,我不会打扰你的一部分):
PROGRAM Main_program
USE mpi
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER
USE configuration_main_module, only: dp ! 8-byte float
IMPLICIT NONE
REAL(dp), DIMENSION(6000,8000) :: data_array
INTEGER :: ierr, rank, size, win, disp_unit
INTEGER(KIND=MPI_ADDRESS_KIND) :: windowsize
TYPE(C_PTR) :: baseptr
! Split program into ranks
CALL MPI_INIT(ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
! Open up a lot of space for the root rank and nothing for the others
IF (rank==0) THEN
windowsize = 6000*8000*8_MPI_ADDRESS_KIND
ELSE
windowsize = 0
END IF
disp_unit = 1
CALL MPI_Win_allocate_shared(windowsize, disp_unit, MPI_INFO_NULL, MPI_COMM_WORLD, baseptr, win, ierr)
CALL MPI_FINALIZE(ierr)
END PROGRAM Main_program
'MPI_WIN_ALLOCATE_SHARED'是MPI-3.0的一部分。您需要一个涵盖该标准版本或更高版本的实现。 –
谢谢,那可能就是这样。我刚刚安装了openmpi-2.0.0,但显然卸载1.10.3版本无法正常工作(现在,即使我卸载旧版本的代码仍然编译,因此版本仍然存在)。 – TijnBerends
您的代码不是Fortran 90.在Fortran 2003中定义了内部模块'iso_c_binding'。 – jlokimlin