Один код MPI, я пытаюсь распараллелить его простой цикл с помощью openacc, и результат не ожидается. Здесь у цикла есть вызов, и я добавляю в подпрограмму «acc regular seq». Если я вручную сделаю этот вызов встроенным и удалю подпрограмму, результат будет правильным. Правильно ли я использую стандартную директиву OpenACC? или другое неправильное?
- Среда выполнения
Версия MPI: openmpi4.0.5
HPC SDK 20.11
Версия CUDA: 10.2
!The main program
program test
use simple
use mpi
implicit none
integer :: i,id,size,ierr,k,n1
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,id,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr)
allocate(type1(m))
do i=1,m
allocate(type1(i)%member(n))
type1(i)%member=-1
type1(i)%member(i)=i
enddo
!$acc update device(m,n)
do k=1,m
n1=0
allocate(dev_mol(k:2*k))
dev_mol=type1(k)%member(k:2*k)
!$acc update device(dev_mol(k:2*k))
!$acc parallel copy(n1) firstprivate(k)
!$acc loop independent
do i=k,2*k
call test1(k,n1,i)
enddo
!$acc end parallel
!$acc update self(dev_mol(k:2*k))
type1(k)%member(k:2*k)=dev_mol
write(*,"('k=',I3,' n1=',I2)") k,n1
deallocate(dev_mol)
enddo
do i=1,m
write(*,"('i=',I2,' member=',I3)") i,type1(i)%member(i)
deallocate(type1(i)%member)
enddo
deallocate(type1)
call MPI_Barrier(MPI_COMM_WORLD,ierr)
call MPI_Finalize(ierr)
end
!Here is the module
module simple
implicit none
integer :: m=5,n=2**15
integer,parameter :: p1=15
integer,allocatable :: dev_mol(:)
type type_related
integer,allocatable :: member(:)
end type
type(type_related),allocatable :: type1(:)
!$acc declare create(m,n,dev_mol)
!$acc declare copyin(p1)
contains
subroutine test1(k,n1,i)
implicit none
integer :: k,n1,i
!$acc routine seq
if(dev_mol(i)>0) then
!write(*,*) 'gpu',k,n1,i
n1=dev_mol(i)
dev_mol(i)=p1
else
if(i==k)write(*,*) 'err',i,dev_mol(i)
endif
end
end
- MPI
команда компиляции : mpif90 test.f90 -o test
выполнить команду : mpirun -n 1 ./test
результат следующим образом:
k= 1 n1= 1
k= 2 n1= 2
k= 3 n1= 3
k= 4 n1= 4
k= 5 n1= 5
i= 1 member= 15
i= 2 member= 15
i= 3 member= 15
i= 4 member= 15
i= 5 member= 15
- MPI + OpenACC
команда компиляции : mpif90 test.f90 -o test -ta = tesla: cuda10.2 -Minfo = Accel
команда запуска : mpirun -n 1 ./test
результат ошибки следующий:
k= 1 n1= 0
k= 2 n1= 0
k= 3 n1= 0
k= 4 n1= 0
k= 5 n1= 0
i= 1 member= 1
i= 2 member= 2
i= 3 member= 3
i= 4 member= 4
i= 5 member= 5