【发布时间】:2016-02-08 18:23:28
【问题描述】:
我在我的混合 MPI/OpenMP 代码中发现了一个问题,该代码被复制 在下面引用的代码中以最简单的形式。我正在使用 2 个线程 每个 MPI 等级。然后在 OpenMP“部分”中使用这两个线程 要进行多次计算,其中之一是对两个不同的向量 A 和 B 进行“mpi_allreduce”调用,其结果 存储在 W 和 WW 中。问题是每次我运行程序 我最终得到不同的输出。我的想法是 MPI 调用是 重叠和缩减的数组 W 和 WW 被组合,即使它们 有不同的名字,但我不确定。关于如何克服的任何评论 这个问题是受欢迎的。
详情: MPI线程级别在代码中初始化为MPI_THREAD_MULTIPLE 但我也尝试过串行和漏斗(同样的问题)。
我编译代码 mpiifort -openmp allreduce_omp_mpi.f90 和 跑步我用:
导出 OMP_NUM_THREADS=2 mpirun -np 3 ./a.out
PROGRAM HELLO
use mpi
use omp_lib
IMPLICIT NONE
INTEGER nthreads, tid
Integer Provided,mpi_err,myid,nproc
CHARACTER(MPI_MAX_PROCESSOR_NAME):: hostname
INTEGER :: nhostchars
integer :: i
real*8 :: A(1000), B(1000), W(1000),WW(1000)
provided=0
!Initialize MPI context
call mpi_init_thread(MPI_THREAD_MULTIPLE,provided,mpi_err)
CALL mpi_comm_rank(mpi_comm_world,myid,mpi_err)
CALL mpi_comm_size(mpi_comm_world,nproc,mpi_err)
CALL mpi_get_processor_name(hostname,nhostchars,mpi_err)
!Initialize arrays
A=1.0
B=2.0
!Check if MPI_THREAD_MULTIPLE is available
if (provided >= MPI_THREAD_MULTIPLE) then
write(6,*) ' mpi_thread_multiple provided',myid
else
write(6,*) ' not mpi_thread_multiple provided',myid
endif
!$OMP PARALLEL PRIVATE(nthreads, tid) NUM_THREADS(2)
!$omp sections
!$omp section
call mpi_allreduce(A,W,1000,mpi_double_precision,mpi_sum,mpi_comm_world,mpi_err)
!$omp section
call mpi_allreduce(B,WW,1000,mpi_double_precision,mpi_sum,mpi_comm_world,mpi_err)
!$omp end sections
!$OMP END PARALLEL
write(6,*) 'W',(w(i),i=1,10)
write(6,*) 'WW',(ww(i),i=1,10)
CALL mpi_finalize(mpi_err)
END
【问题讨论】:
-
一个不请自来的可移植性建议:不要使用以
mpi_开头的名称来命名您自己的变量和常量。这样做可能会导致与 MPI 库的名称冲突。此外,不能保证DOUBLE_PRECISION和REAL*8是同一种类型。 -
我要添加另一个建议,不要使用
write(6,,而是使用write(*,。它不再更便携。
标签: multithreading fortran mpi openmp hybrid