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 <
[email protected]> 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
>
>