2016-07-15 158 views
0

所以我试图并行化一个我使用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 
+3

'MPI_WIN_ALLOCATE_SHARED'是MPI-3.0的一部分。您需要一个涵盖该标准版本或更高版本的实现。 –

+0

谢谢,那可能就是这样。我刚刚安装了openmpi-2.0.0,但显然卸载1.10.3版本无法正常工作(现在,即使我卸载旧版本的代码仍然编译,因此版本仍然存在)。 – TijnBerends

+2

您的代码不是Fortran 90.在Fortran 2003中定义了内部模块'iso_c_binding'。 – jlokimlin

回答

0

下面的代码编译并运行没有错误与英特尔Fortran 16.0.2和MPICH 3.2。注意,我触摸分配的缓冲区并在退出之前释放窗口。我还选择了不使用大量内存的数组维度。

您可以尝试使用较小的数组维度进行测试,并扩展至失败,以查看问题是否与共享内存资源不足有关,这与Sys5共享内存API相当常见,但不是POSIX共享内存API。

如果不是资源问题,它可能是Open-MPI中的一个错误。请将错误报告给Open-MPI并切换到MPICH。对于它的价值,我没有看到Open-MPI存在任何MPI-3共享内存问题,但我没有像其他人一样测试它,并且我从不使用Fortran中的RMA。

PROGRAM Main_program 

USE mpi 
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER 
use iso_fortran_env 

IMPLICIT NONE 

REAL(kind=REAL64), DIMENSION(60,80) :: 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 = 60*80*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) 
if (ierr .ne. 0) call MPI_Abort(MPI_COMM_WORLD, ierr, -1) 
CALL MPI_Win_lock_all(0, win, ierr) 
if (rank .eq. 0) data_array = 0 
CALL MPI_Win_unlock_all(win, ierr) 
CALL MPI_Win_free(win, ierr) 

CALL MPI_FINALIZE(ierr) 

END PROGRAM Main_program 
相关问题