【发布时间】:2016-11-18 13:06:50
【问题描述】:
所以我正在尝试并行化我使用 MPI 的 Fortran 2003 程序。我在具有 64Gb 共享内存的 16 个处理器内核的节点上运行它。我的 MPI 通信器中的 16 个等级必须对一个相当大的数组(大约 6000 x 8000 个元素,双精度)的一部分应用一些算法。
现在,我使用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 版本没有正常工作(现在,即使我卸载了旧版本的代码仍然可以编译,所以某个地方有一个版本)。
-
您的代码不是 Fortran 90。内在模块
iso_c_binding是在 Fortran 2003 的后期定义的。 -
Open MPI 1.10.3 确实支持 MPI-3.0。那你的问题就是别的了。
标签: fortran mpi shared-memory