Ich versuche, das zuweisbare Array an die Subroutine übergeben. Wenn ich die serielle Version verwende, wie in How to pass allocatable arrays to subroutines in Fortran erwähnt, funktioniert es gut. Unten ist meine serielle Version des Codes.Übergeben des zuweisbaren Array zu Unterprogramm in Fortran mit MPI
module test
contains
subroutine func(a,sqa,n)
implicit none
integer, intent(in) :: n
integer, intent(in), dimension(:,:) :: a
integer, intent(out), dimension(:,:):: sqa
!local variables
integer :: i,j
do i= 1,n
do j = 1,2
sqa(i,j) = a(i,j)*a(i,j)
print *, 'i',i, 'j', j,'sqa(i,j)',sqa(i,j)
end do
end do
end subroutine func
end module test
program main
use test
implicit none
integer :: n,i,j
integer, dimension(:,:), allocatable :: a, sqa
print *, 'enter no of rows'
read *, n
allocate(a(1:n,2))
allocate(sqa(1:n,2))
do i = 1,n
do j = 1, 2
a(i,j) = i +j
print *, 'i =',i,'j =',j, a(i,j)
end do
end do
call func(a, sqa,n)
deallocate(a,sqa)
end program main
Wenn ich beginnen mit MPI, meine parallele Version von Code zu implementieren ist
module test
contains
subroutine func(a,sqa,istart,iend)
implicit none
integer, intent(in) :: istart, iend
integer, intent(in), dimension(:,:) :: a
integer, intent(out),dimension(:,:) :: sqa
!local variables
integer :: i,j
do i= istart, iend
do j = 1,2
sqa(i,j) = a(i,j)*a(i,j)
print *, 'i',i, 'j', j,'sqa(i,j)',sqa(i,j)
end do
end do
end subroutine func
end module test
program main
use test
use mpi
implicit none
integer :: istart, iend, ierr,nproc, procnum, n,&
points_per_thread, i,j
integer, dimension(:,:), allocatable :: a, sqa
integer,dimension(mpi_status_size) :: status
call mpi_init(ierr)
call mpi_comm_size(mpi_comm_world, nproc, ierr)
call mpi_comm_rank(mpi_comm_world,procnum, ierr)
if(procnum == 0)then
print *, 'enter no of rows'
read *, n
end if
call mpi_bcast(n,1,mpi_integer,0,mpi_comm_world, ierr)
points_per_thread = (n + nproc - 1)/nproc
istart = procnum*points_per_thread + 1
iend = min((procnum + 1)*points_per_thread,n)
print *, 'istart ', istart, 'iend', iend, 'procnum', procnum
call mpi_barrier(mpi_comm_world, ierr)
allocate(a(istart:iend,2))
allocate(sqa(istart:iend,2))
do i = istart,iend
do j = 1, 2
a(i,j) = i +j
print *, 'i =',i,'j =',j, a(i,j)
end do
end do
call mpi_barrier(mpi_comm_world, ierr)
call func(a(istart:iend,:), sqa(istart:iend,:),istart,iend)
deallocate(a,sqa)
call mpi_finalize(ierr)
end program main
Der obige Code den Segmentierungsfehler Fehler gibt. Ich verstehe den Grund dafür nicht.
Wenn als nächstes in meinem Unterprogramm func ich die Deklaration von Arrays ein und sqa zu
integer,intent(in):: a(istart:iend,2)
integer, intent(out)::sqa(istart:iend,2)
Jetzt ändern funktioniert es gut. Ich bitte darum, mir zu helfen, den Grund für den Fehler zu verstehen.
Willkommen. Verwenden Sie tag [tag: fortran] für apl Fortran Fragen. –
In welcher Zeile stürzt es ab? Was druckt es? Lernen Sie die Debugging-Funktionen Ihres Compilers kennen (zB '-g -fbacktrace -fcheck = all 'in gfortran und' -g -traceback -check' in ifort). –
Die untere Grenze eines angenommenen Shape-Arrays ist standardmäßig 1. Wenn Sie möchten, dass es istart ist, müssen Sie es als 'array (istart:)' deklarieren. Siehe den doppelten Link für mehr. Oder ändern Sie einfach die Schleife zu 'i = 1, Größe (a, 1)' –