And with this change (alone) - the time to compile the f90 modules went (on 
pj01 testbox) from:

0m48.676s
to
0m15.053s

Satish

On Tue, 16 Mar 2021, Satish Balay via petsc-dev wrote:

> Ah - the issue is 'import IS' vs 'import tIS'
> 
> Pushed a fix now. [and reverted my earlier source split change]. My build 
> goes through fine now.
> 
> Satish
> 
> On Tue, 16 Mar 2021, Barry Smith wrote:
> 
> > 
> >   Satish,
> > 
> >     The  import tIS might only work because the IS is already defined in 
> > the same file so the compiler can pull in just part of the use 
> > petscisdefdummy ? If the original module that contains the PetscRandom is 
> > in a different file then I don't see how the compiler can find and import 
> > PetscRandom. Is there a version of import where you also list the module 
> > (file) that the beast is from so the compiler can get it from that module?
> > 
> >   Barry
> > 
> >     Do both the manually generated petsc*mod.F90 and the automatically 
> > generated files need to be switched to not use use everywhere? Or is it 
> > enough just to fix the manual ones for now and not mess with sowing?
> > 
> > 
> > 
> > > On Mar 16, 2021, at 2:34 PM, Satish Balay via petsc-dev 
> > > <[email protected]> wrote:
> > > 
> > > On Tue, 16 Mar 2021, Satish Balay via petsc-dev wrote:
> > > 
> > >> 
> > >> 
> > >> Tue, 16 Mar 2021, Jacob Faibussowitsch 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
> > >> 
> > >> generatefortranstubs.py has some hakey parsing code. I guess it can be 
> > >> updated to do this.
> > >> 
> > >> i.e - look for 'type(tIS)' and add 'import tIS'
> > > 
> > > I pushed changes to generatefortranstubs.py for this (to
> > > balay/reorg-f90-for-xlf branch). But there are errors. (I don't 
> > > completely understand this issue yet)
> > > 
> > >>>> 
> > >          FC arch-linux-c-debug/obj/sys/f90-mod/petscsysmod.o
> > > /home/balay/petsc/include/../src/sys/f90-mod/ftn-auto-interfaces/petscsys.h90:6:19:
> > > 
> > >    6 |        import PetscRandom
> > >      |                   1
> > > Error: Cannot IMPORT ‘type’ from host scoping unit at (1) - does not 
> > > exist.
> > > /home/balay/petsc/include/../src/sys/f90-mod/ftn-auto-interfaces/petscsys.h90:7:26:
> > > 
> > >    7 |        PetscRandom a ! PetscRandom
> > >      |                          1
> > > Error: Derived type ‘tpetscrandom’ at (1) is being used before it is 
> > > defined
> > > <<<<
> > > 
> > > 
> > > Satish
> > > 
> > >> 
> > >>> end function isnotequal
> > >>> 
> > >>> This works for everything wrapped in a module which contains an 
> > >>> interface block. For dangling functions the following works:
> > >> 
> > >> Hm - maybe these are only on the custom side [and not ftn-auto side]
> > >> 
> > >> Satish
> > >>> 
> > >>> 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 <[email protected]> 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 
> > >>>>>> <[email protected]> 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
> > >>>>> 
> > >>>>> 
> > >>> 
> > >>> 
> > 

Reply via email to