Sorry for the noise, when compiled with OpenMPI/4.1.4 the problem does not appear. So, it looks like it's an MPICH bug rather than a GCC one.
On Mon, Jul 1, 2024 at 4:14 PM Salvatore Filippone < filippone.salvat...@gmail.com> wrote: > Ooops, looks like the attachment was not well received by the mailer. > ------------------------ tsm.F90 ---------------------- > module const_mod > integer, parameter :: psb_mpk_ = selected_int_kind(8) > type :: psb_ctxt_type > integer(psb_mpk_), allocatable :: ctxt > end type psb_ctxt_type > > end module const_mod > > module penv_mod > use const_mod > contains > subroutine psb_init(ctxt) > use const_mod > use mpi > implicit none > type(psb_ctxt_type), intent(out) :: ctxt > integer(psb_mpk_) :: i, icomm > logical :: initialized > integer(psb_mpk_) :: np_, npavail, iam, info, basecomm > character(len=20), parameter :: name='psb_init' > integer(psb_mpk_) :: iinfo > ! > call mpi_init(info) > basecomm = mpi_comm_world > call mpi_comm_dup(basecomm,icomm,info) > if (info == 0) then > ctxt%ctxt = icomm ! allocate on assignment > end if > > end subroutine psb_init > subroutine psb_exit(ctxt) > type(psb_ctxt_type), intent(inout) :: ctxt > return > end subroutine psb_exit > end module penv_mod > > module base_sv_mod > use const_mod > > type base_sv_type > contains > end type base_sv_type > > end module base_sv_mod > > module base_sm_mod > > use base_sv_mod > > type base_sm_type > class(base_sv_type), allocatable :: sv > contains > procedure, pass(sm) :: free => base_sm_free > procedure, pass(sm) :: clone_settings => base_sm_clone_settings > end type base_sm_type > > contains > subroutine base_sm_clone_settings(sm,smout,info) > Implicit None > > ! Arguments > class(base_sm_type), intent(inout) :: sm > class(base_sm_type), intent(inout) :: smout > integer(psb_mpk_), intent(out) :: info > info = 0 > end subroutine base_sm_clone_settings > > subroutine base_sm_free(sm,info) > ! Arguments > class(base_sm_type), intent(inout) :: sm > integer(psb_mpk_), intent(out) :: info > info = 0 > if (allocated(sm%sv)) deallocate(sm%sv,stat=info) > end subroutine base_sm_free > > end module base_sm_mod > > module jc_sm_mod > > use base_sm_mod > > type, extends(base_sm_type) :: jc_sm_type > contains > procedure, pass(sm) :: clone_settings => jc_sm_clone_settings > end type jc_sm_type > > contains > > subroutine jc_sm_clone_settings(sm,smout,info) > class(jc_sm_type), intent(inout) :: sm > class(base_sm_type), allocatable, intent(inout) :: smout > integer(psb_mpk_), intent(out) :: info > > info = 0 > write(0,*) name,' check 1:',allocated(smout%sv),allocated(sm%sv) > if (allocated(smout%sv)) write(0,*) name,' check > 1.5:',same_type_as(sm%sv,smout%sv) > end subroutine jc_sm_clone_settings > > end module jc_sm_mod > > > program tsm > use penv_mod > use jc_sm_mod > implicit none > > ! parallel environment > type(psb_ctxt_type) :: ctxt > integer(psb_mpk_) :: iam, np > > type(jc_sm_type) :: jacsmth > class(base_sm_type), allocatable :: save1, save2 > > ! other variables > integer(psb_mpk_) :: info > character(len=20) :: name > > info=0 > > call psb_init(ctxt) > > allocate(jacsmth%sv) > call check_save_smoothers(jacsmth,save1, save2,info) > > call psb_exit(ctxt) > stop > > contains > > subroutine check_save_smoothers(insmth,save1, save2,info) > class(base_sm_type), intent(inout) :: insmth > class(base_sm_type), allocatable, intent(inout) :: save1, save2 > integer(psb_mpk_), intent(out) :: info > > info = 0 > if (allocated(save1)) then > call save1%free(info) > if (info == 0) deallocate(save1,stat=info) > if (info /= 0) then > write(0,*) 'Error from deallocate save1?',info > return > end if > end if > if (allocated(save2)) then > call save2%free(info) > if (info == 0) deallocate(save2,stat=info) > if (info /= 0) then > write(0,*) 'Error from deallocate save2?',info > return > end if > end if > write(0,*) 'From check_save_smoothers 0:',info,allocated(save1) > allocate(save1, mold=insmth,stat=info) > write(0,*) 'From check_save_smoothers 1:',info,allocated(save1) > if (allocated(save1)) write(0,*) 'From check_save_smoothers > 1.25:',info,allocated(save1%sv) > if (info == 0) call insmth%clone_settings(save1,info) > write(0,*) 'Done first clone settings' > return > end subroutine check_save_smoothers > > end program tsm > > -------------------------------------------------------------------------------------- > > On Mon, Jul 1, 2024 at 4:12 PM Salvatore Filippone < > filippone.salvat...@gmail.com> wrote: > >> Dear All >> I have encountered a strange issue that seems to be caused by some weird >> interaction between gcc 13.3.0 and MPI (mpich/4.1.0). >> With mpich/4.1 and gcc-13.3 the attached code runs with the results >> $ ./tsm >> hwloc/linux: Ignoring PCI device with non-16bit domain. >> Pass --enable-32bits-pci-domain to configure to support such devices >> (warning: it would break the library ABI, don't enable unless really >> needed). >> From check_save_smoothers 0: 0 F >> From check_save_smoothers 1: 0 T >> From check_save_smoothers 1.25: 0 T >> 0 check 1: T T >> >> Program received signal SIGSEGV: Segmentation fault - invalid memory >> reference. >> >> Backtrace for this error: >> #0 0x7f75dca5370f in ??? >> #1 0x401f79 in ??? >> #2 0x4026a0 in ??? >> #3 0x40280f in ??? >> #4 0x402861 in ??? >> #5 0x7f75dca3d087 in ??? >> #6 0x7f75dca3d14a in ??? >> #7 0x401144 in ??? >> #8 0xffffffffffffffff in ??? >> >> >> As you can see in the attached code, the allocation with a MOLD= argument >> results in the inner component appearing to be allocated when it is >> actually not (lines 152-155 of the source code) resulting in the message >> " From check_save_smoothers 1.25: 0 T" >> which is totally bogus (it should print F). >> >> If I comment out anything related with MPI the code works fine; it also >> works fine with mpich/4.1 compiled with other GCC versions (12.X, 13.1, >> 13.2, 14.1) >> >> What would you suggest for further investigation/reporting? >> >> Thanks >> Salvatore Filippone >> >>