[petsc-dev] Case TS005062693 - XLF: ICE in xlfentry compiling a module with 358 subroutines

Satish Balay balay at mcs.anl.gov
Tue Mar 16 14:14:16 CDT 2021


On Tue, 16 Mar 2021, Matthew Knepley wrote:

> On Tue, Mar 16, 2021 at 2:42 PM Jacob Faibussowitsch <jacob.fai at gmail.com>
> wrote:
> 
> > To me the best solution is to first split the files when possible (it is
> > often not or just too painful) and then adding imports if needed.
> >
> >
> > I’m not sure I agree. Bear in mind my familiarity with fortran is very
> > limited, but to me the “use” statement is similar to #include <header> in C
> > or using namespace xxx in cpp.
> >
> > Our fortran interface is not optimal code atm, it’s as if we put a
> >  "#include <petscvec.h>” before every Vec function in the C source
> > (assuming include guards are not used). Sure you can fix this by splitting
> > the vec src files in two, but at the end of the day that’s a bandaid
> > solution. I think I can get the import stuff to work reasonably well (a lot
> > of the infrastructure to capture types is already present in the current
> > generatefortranstubs).
> >
> 
> If you can get this to work, we should definitely do it. Was there a
> question about getting it to work?

Likely these additional changes should be done starting with Barry's split-up of sources.

Satish

> 
>   Thanks,
> 
>      Matt
> 
> 
> > Best regards,
> >
> > Jacob Faibussowitsch
> > (Jacob Fai - booss - oh - vitch)
> > Cell: (312) 694-3391
> >
> > On Mar 16, 2021, at 12:56, Barry Smith <bsmith at petsc.dev> wrote:
> >
> >
> >    Jacob,
> >
> >      I split  the mat definitions in the MR
> > https://gitlab.com/petsc/petsc/-/merge_requests/3696 and this reduced
> > memory requirements enough to get builds through on some VM that failed
> > previously ran out of memory (with gfortran).
> >
> >      The petsc*mod.F90 files are all handwritten so it is ok to manually
> > change them with imports if that helps the IBM compiler. To me the best
> > solution is to first split the files when possible (it is often not or just
> > too painful) and then adding imports if needed.
> >
> >      Note also the MR
> > https://gitlab.com/petsc/petsc/-/merge_requests/3715/diffs which may help
> > a great deal with the IBM compiler or not.
> >
> >      Thanks
> >
> >      Barry
> >
> >
> >
> > On Mar 16, 2021, at 11:47 AM, Jacob Faibussowitsch <jacob.fai at gmail.com>
> > wrote:
> >
> > Ok something I have gotten to work, but only doing things by hand in
> > petscvecmod.F90:
> >
> > diff --git a/src/vec/f90-mod/petscvecmod.F90
> > b/src/vec/f90-mod/petscvecmod.F90
> > index 0c447156b9..ef3e2e2e55 100644
> > --- a/src/vec/f90-mod/petscvecmod.F90
> > +++ b/src/vec/f90-mod/petscvecmod.F90
> >  module petscisdef
> >  use petscisdefdummy
> >  interface operator(.ne.)
> >  function isnotequal(A,B)
> > -  use petscisdefdummy
> > + import tIS
> >    logical isnotequal
> >
> >    type(tIS), intent(in) :: A,B
> >  end function isnotequal
> >
> > This works for everything wrapped in a module which contains an interface
> > block. For dangling functions the following works:
> >
> >  function isnotequal(A,B)
> > -  use petscisdefdummy
> > + use petscisdef, only: tIs
> >    logical isnotequal
> >    type(tIS), intent(in) :: A,B
> >    isnotequal = (A%v .ne. B%v)
> >  end function isnotequal
> >
> > Do our fortran stub generators have any notion of types? Specifically
> > types that originate from petsc?
> >
> > Best regards,
> >
> > Jacob Faibussowitsch
> > (Jacob Fai - booss - oh - vitch)
> > Cell: (312) 694-3391
> >
> > On Mar 16, 2021, at 11:11, Satish Balay <balay at mcs.anl.gov> wrote:
> >
> > On Tue, 16 Mar 2021, Jacob Faibussowitsch wrote:
> >
> > My [partial] change is in branch balay/reorg-f90-for-xlf
> >
> >
> > Satish is this branch pushed? I’d like to send it to the ibm folks to see
> > if it works for them as well.
> >
> >
> > Sorry - pushed now. From what I remember - it didn't work.
> >
> > Satish
> >
> >
> > They also added this extra follow up:
> >
> > The change we did in the source files is to replace all the "use pet*"
> > statements in all the Interface blocks with IMPORT statement.
> >
> > The nature of this workaround is to reduce the number of symbols that the
> > compiler have to create, which exceeded the limitation and caused ICE.
> >
> > Every USE statement in an interface block opens up the module symbol file
> > and reads all the symbols from it and creates an entity for each symbol in
> > compiler. This is unnecessary when the module already has the same USE
> > statement in the module scope. Instead, users can use IMPORT statement to
> > make the module symbols accessible inside interface face blocks.
> >
> > With the change, the compiler would only read the module symbol file once
> > and create one set of symbols where the old code reads the module symbol
> > files as many times as the number of the USE statements in Interface blocks
> > and create that many sets of duplicate symbols. Replacing those USE
> > statements with IMPORT statements also shortens the compile time
> > significantly.
> >
> > Best regards,
> >
> > Jacob Faibussowitsch
> > (Jacob Fai - booss - oh - vitch)
> > Cell: (312) 694-3391
> >
> > On Mar 3, 2021, at 13:43, Satish Balay via petsc-dev <
> > petsc-dev at mcs.anl.gov> wrote:
> >
> > The only change I can get working (i.e avoid compile errors) is to split
> > petscvecmod.F90 into 2 source files - but I don't know if this will help
> > with xlf..
> >
> > My [partial] change is in branch balay/reorg-f90-for-xlf
> >
> > Satish
> >
> > On Wed, 3 Mar 2021, Satish Balay via petsc-dev wrote:
> >
> > On Wed, 3 Mar 2021, Satish Balay via petsc-dev wrote:
> >
> > Sure - once any change works locally [for gcc and xlf]
> >
> > When I try - I get a bunch of errors.. [yet to digest them.]
> >
> >
> > Can you please give the following source code workaround a try?
> > Since there is already "use petscvecdefdummy" at the module scope, one
> > workaround might be to remove the unnecessary "use petscvecdefdummy" in
> > vecnotequal and vecequals
> > and all similar procedures.
> >
> > For example, the test case has:
> >      module petscvecdef
> >      use petscvecdefdummy
> > ...
> >      function vecnotequal(A,B)
> >        use petscvecdefdummy
> >        logical vecnotequal
> >        type(tVec), intent(in) :: A,B
> >        vecnotequal = (A%v .ne. B%v)
> >      end function
> >
> >
> >
> > Ok - try this suggestion:
> >
> > diff --git a/src/vec/f90-mod/petscvecmod.F90
> > b/src/vec/f90-mod/petscvecmod.F90
> > index 0c447156b9..81968c7ca1 100644
> > --- a/src/vec/f90-mod/petscvecmod.F90
> > +++ b/src/vec/f90-mod/petscvecmod.F90
> > @@ -77,7 +77,6 @@
> >        use petscvecdefdummy
> >        interface operator(.ne.)
> >          function vecnotequal(A,B)
> > -            use petscvecdefdummy
> >            logical vecnotequal
> >            type(tVec), intent(in) :: A,B
> >          end function
> >
> >
> >
> >         FC arch-linux-c-debug/obj/vec/f90-mod/petscvecmod.o
> > /home/balay/petsc/src/vec/f90-mod/petscvecmod.F90:81:22:
> >
> >  81 |             type(tVec), intent(in) :: A,B
> >     |                      1
> > Error: Derived type ‘tvec’ at (1) is being used before it is defined
> >
> > /home/balay/petsc/include/../src/vec/f90-mod/ftn-auto-interfaces/petscis.h90:2:10:
> >
> >   2 |       use petscvecdef
> >     |          1
> > Fatal Error: Cannot open module file ‘petscvecdef.mod’ for reading at (1):
> > No such file or directory
> > <<<<<<
> >
> > Satish
> >
> >
> >
> >
> >
> >
> >
> 
> 


More information about the petsc-dev mailing list