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
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