LCOV - code coverage report
Current view: top level - src/98_main - testtransposer.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 93.6 % 173 162
Test Date: 2026-09-21 13:49:52 Functions: 100.0 % 6 6

            Line data    Source code
       1              : !!****p* ABINIT/testTransposer
       2              : !! NAME
       3              : !! testTransposer
       4              : !!
       5              : !! FUNCTION
       6              : !! test the xgTransposer module with 8 MPI. No more no less.
       7              : !! It includes testing of complex and real numbers, and all2all and gatherv
       8              : !!
       9              : !! COPYRIGHT
      10              : !! Copyright (C) 1998-2026 ABINIT group (JB)
      11              : !! This file is distributed under the terms of the
      12              : !! GNU General Public License, see ~abinit/COPYING
      13              : !! or http://www.gnu.org/copyleft/gpl.txt .
      14              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      15              : !!
      16              : !! NOTES
      17              : !!
      18              : !! INPUTS
      19              : !!  (main routine)
      20              : !!
      21              : !! OUTPUT
      22              : !!  (main routine)
      23              : !!
      24              : !! SOURCE
      25              : 
      26              : #if defined HAVE_CONFIG_H
      27              : #include "config.h"
      28              : #endif
      29              : 
      30              : #include "abi_common.h"
      31            2 : program testTransposer
      32            2 :   use m_xg
      33              :   use m_xgTransposer
      34              :   use m_xmpi
      35              :   use m_time
      36              :   use defs_basis
      37              :   use m_profiling_abi
      38              :   use m_errors
      39              : 
      40              :   implicit none
      41              : 
      42              :   integer :: npw
      43              :   integer :: nband
      44              :   integer :: ncycle
      45              :   integer :: i
      46              :   integer :: ierr
      47              :   double precision :: errmax
      48              :   double precision :: walltime
      49              :   double precision :: cputime
      50              :   double precision :: maxt
      51              :   integer :: nCpuCols, nCpuRows
      52            2 :   double precision, allocatable :: cg(:,:)
      53            2 :   double precision, allocatable :: cg0(:,:)
      54            2 :   double precision, allocatable :: gh(:,:)
      55            2 :   double precision, allocatable :: ghc(:,:)
      56              :   character(len=40) :: names(8)
      57              : 
      58              :   double precision :: nflops, ftimes(2)
      59              :   integer :: ncount
      60              :   double precision :: times(2)
      61              : 
      62              :   type(xgBlock_t) :: xcgLinalg
      63              :   type(xgBlock_t) :: xcgColsRows
      64              :   type(xgBlock_t) :: xghLinalg
      65              :   type(xgBlock_t) :: xghColsRows
      66              :   type(xgBlock_t) :: xghcLinalg
      67              :   type(xgBlock_t) :: xghcColsRows
      68            2 :   type(xgTransposer_t) :: xgTransposer
      69              : 
      70              : 
      71            2 :   names(1662-1661) = 'xgTransposer_transpose@ColsRows'
      72            2 :   names(1663-1661) = 'xgTransposer_transpose@Linalg  '
      73            2 :   names(1664-1661) = 'xgTransposer_*@all2all         '
      74            2 :   names(1665-1661) = 'xgTransposer_*@gatherv         '
      75            2 :   names(1666-1661) = 'xgTransposer_@reorganize       '
      76            2 :   names(1667-1661) = 'xgTransposer_*constructor      '
      77            2 :   names(1668-1661) = 'xgTransposer_free              '
      78            2 :   names(1669-1661) = 'xgTransposer_transpose         '
      79              : 
      80            2 :   call xmpi_init()
      81              : 
      82            2 :   npw = 4000+2*xmpi_comm_rank(xmpi_world)
      83            2 :   nband = 2000
      84            2 :   ncycle = 20
      85            2 :   if ( xmpi_comm_size(xmpi_world) > 1 ) then
      86            0 :     if ( MOD(xmpi_comm_size(xmpi_world),10) == 0 ) then
      87            0 :       nCpuRows = 2
      88            0 :     else if ( MOD(xmpi_comm_size(xmpi_world),8) == 0 ) then
      89            0 :       nCpuRows = 4
      90            0 :     else if ( MOD(xmpi_comm_size(xmpi_world),6) == 0 ) then
      91            0 :       nCpuRows = 3
      92            0 :     else if ( MOD(xmpi_comm_size(xmpi_world),4) == 0 ) then
      93            0 :       nCpuRows = 2
      94              :     else
      95            0 :       nCpuRows = 1
      96              :     end if
      97            0 :     nCpuCols = xmpi_comm_size(xmpi_world)/nCpuRows
      98              :   else
      99            2 :     nCpuRows = 1
     100            2 :     nCpuCols = 1
     101              :   end if
     102              : 
     103            2 :   std_out = 6+xmpi_comm_rank(xmpi_world)
     104              : 
     105            2 :   write(std_out,*) " nCpuRows,nCpuCols",nCpuRows,nCpuCols
     106              : 
     107              : 
     108              :  ! Initialize memory profiling if it is activated
     109              :  ! if a full memocc.prc report is desired, set the argument of abimem_init to "2" instead of "0"
     110              :  ! note that memocc.prc files can easily be multiple GB in size so don't use this option normally
     111              : #ifdef HAVE_MEM_PROFILING
     112              :  call abimem_init(0)
     113              : #endif
     114              : 
     115            2 :   call test1()
     116              : 
     117              :   ! nspinor = 1
     118            2 :   call test2(1)
     119              : 
     120              :   ! nspinor = 2
     121            2 :   call test2(2)
     122              : 
     123            2 :   call xg_finalize()
     124              : 
     125              : 
     126              :  ! Writes information on file about the memory before ending mpi module, if memory profiling is enabled
     127            2 :  call abinit_doctor("__testtransposer")
     128              : 
     129            2 :   call xmpi_end()
     130              : 
     131              :   contains
     132              : !!***
     133              : 
     134              : !!****f* testTransposer/test1
     135              : !!
     136              : !! NAME
     137              : !! test1
     138              : !!
     139              : !! FUNCTION
     140              : !!
     141              : !! COPYRIGHT
     142              : !! Copyright (C) 1998-2026 ABINIT group (JB)
     143              : !! This file is distributed under the terms of the
     144              : !! GNU General Public License, see ~abinit/COPYING
     145              : !! or http://www.gnu.org/copyleft/gpl.txt .
     146              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     147              : !!
     148              : !! NOTES
     149              : !!
     150              : !! INPUTS
     151              : !!  (main routine)
     152              : !!
     153              : !! OUTPUT
     154              : !!  (main routine)
     155              : !!
     156              : !! SOURCE
     157            2 :   subroutine test1()
     158            2 :     ABI_MALLOC(cg, (2,npw*nband))
     159            2 :     ABI_MALLOC(cg0, (2,npw*nband))
     160              : 
     161            2 :     call random_number(cg)
     162     48000002 :     cg0(:,:) = cg(:,:)
     163              : 
     164            2 :     call xgBlock_map(xcgLinalg,cg,SPACE_C,npw,nband,xmpi_world)
     165              : 
     166            2 :     write(std_out,*) " Complex all2all"
     167              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,1,&
     168            2 :       STATE_LINALG,TRANS_ALL2ALL,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     169            2 :     call backAndForth()
     170            2 :     call xgTransposer_free(xgTransposer)
     171            2 :     call printTimes()
     172              : 
     173            2 :     write(std_out,*) " Complex gatherv"
     174              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,1,&
     175            2 :       STATE_LINALG,TRANS_GATHER,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     176            2 :     call backAndForth()
     177            2 :     call xgTransposer_free(xgTransposer)
     178            2 :     call printTimes()
     179              : 
     180            2 :     call xgBlock_map(xcgLinalg,cg,SPACE_CR,npw,nband,xmpi_world)
     181              : 
     182            2 :     write(std_out,*) " Real all2all"
     183              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,1,&
     184            2 :       STATE_LINALG,TRANS_ALL2ALL,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     185            2 :     call backAndForth()
     186            2 :     call xgTransposer_free(xgTransposer)
     187            2 :     call printTimes()
     188              : 
     189            2 :     write(std_out,*) " Real gatherv"
     190              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,1,&
     191            2 :       STATE_LINALG,TRANS_GATHER,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     192            2 :     call backAndForth()
     193            2 :     call xgTransposer_free(xgTransposer)
     194            2 :     call printTimes()
     195              : 
     196            2 :     write(std_out,*) " Complex all2all (nspinor=2)"
     197              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,2,&
     198            2 :       STATE_LINALG,TRANS_ALL2ALL,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     199            2 :     call backAndForth()
     200            2 :     call xgTransposer_free(xgTransposer)
     201            2 :     call printTimes()
     202              : 
     203            2 :     write(std_out,*) " Complex gatherv (nspinor=2)"
     204              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,2,&
     205            2 :       STATE_LINALG,TRANS_GATHER,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     206            2 :     call backAndForth()
     207            2 :     call xgTransposer_free(xgTransposer)
     208            2 :     call printTimes()
     209              : 
     210            2 :     call xgBlock_map(xcgLinalg,cg,SPACE_CR,npw,nband,xmpi_world)
     211              : 
     212            2 :     write(std_out,*) " Real all2all (nspinor=2)"
     213              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,2,&
     214            2 :       STATE_LINALG,TRANS_ALL2ALL,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     215            2 :     call backAndForth()
     216            2 :     call xgTransposer_free(xgTransposer)
     217            2 :     call printTimes()
     218              : 
     219            2 :     write(std_out,*) " Real gatherv (nspinor=2)"
     220              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,2,&
     221            2 :       STATE_LINALG,TRANS_GATHER,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     222            2 :     call backAndForth()
     223            2 :     call xgTransposer_free(xgTransposer)
     224            2 :     call printTimes()
     225              : 
     226            2 :     ABI_FREE(cg)
     227            2 :     ABI_FREE(cg0)
     228            2 :   end subroutine test1
     229              : !!***
     230              : 
     231              : !!****f* testTransposer/test2
     232              : !!
     233              : !! NAME
     234              : !! test2
     235              : !!
     236              : !! FUNCTION
     237              : !!
     238              : !! COPYRIGHT
     239              : !! Copyright (C) 1998-2026 ABINIT group (JB)
     240              : !! This file is distributed under the terms of the
     241              : !! GNU General Public License, see ~abinit/COPYING
     242              : !! or http://www.gnu.org/copyleft/gpl.txt .
     243              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     244              : !!
     245              : !! NOTES
     246              : !!
     247              : !! INPUTS
     248              : !!  (main routine)
     249              : !!
     250              : !! OUTPUT
     251              : !!  (main routine)
     252              : !!
     253              : !! SOURCE
     254            4 :   subroutine test2(nspinor)
     255              :     integer,intent(in) :: nspinor
     256            4 :     type(xgTransposer_t) :: xgTransposerGh
     257            4 :     type(xgTransposer_t) :: xgTransposerGhc
     258              :     type(xg_t) :: dotLinalg
     259              :     type(xg_t) :: dotColsRows
     260              :     double precision :: maxdiff
     261              : 
     262            4 :     write(std_out,*) "Allocation"
     263            4 :     ABI_MALLOC(cg,(2,npw*nband))
     264            4 :     ABI_MALLOC(gh,(2,npw*nband))
     265            4 :     ABI_MALLOC(ghc,(2,npw*nband))
     266              : 
     267            4 :     write(std_out,*) "Mapping"
     268            4 :     call xgBlock_map(xcgLinalg,cg,SPACE_C,npw,nband,xmpi_world)
     269            4 :     call xgBlock_map(xghLinalg,gh,SPACE_C,npw,nband,xmpi_world)
     270            4 :     call xgBlock_map(xghcLinalg,ghc,SPACE_C,npw,nband,xmpi_world)
     271              : 
     272            4 :     write(std_out,*) "Transposer constructor : nspinor =",nspinor
     273              : 
     274              :     call xgTransposer_constructor(xgTransposer,xcgLinalg,xcgColsRows,nspinor,&
     275            4 :       STATE_LINALG,TRANS_ALL2ALL,xmpi_comm_null,xmpi_comm_null,ncpuCols,ncpuRows,0)
     276            4 :     call xgTransposer_copyConstructor(xgTransposerGh,xgTransposer,xghLinalg,xghColsRows,STATE_LINALG)
     277            4 :     call xgTransposer_copyConstructor(xgTransposerGhc,xgTransposer,xghcLinalg,xghcColsRows,STATE_LINALG)
     278              : 
     279            4 :     write(std_out,*) "Init data"
     280            4 :     call random_number(cg)
     281            4 :     call random_number(gh)
     282              :     !call initVectors()
     283              : 
     284            4 :     write(std_out,*) "Linalg division"
     285            4 :     call xgBlock_colwiseDivision(xcgLinalg,xghLinalg,xghcLinalg)
     286              : 
     287            4 :     write(std_out,*) "Linalg norm2"
     288            4 :     call xg_init(dotLinalg,SPACE_R,nband,1,xmpi_world)
     289            4 :     call xgBlock_colwiseNorm2(xghcLinalg,dotLinalg%self)
     290              :     !call xgBlock_print(dotLinalg%self,std_out)
     291              : 
     292            4 :     write(std_out,*) "Transposer transpose"
     293            4 :     call xgTransposer_transpose(xgTransposer,STATE_COLSROWS)
     294            4 :     call xgTransposer_transpose(xgTransposerGh,STATE_COLSROWS)
     295            4 :     call xgTransposer_transpose(xgTransposerGhc,STATE_COLSROWS)
     296              : 
     297            4 :     write(std_out,*) "ColsRows divisions"
     298            4 :     call xgBlock_colwiseDivision(xcgColsRows,xghColsRows,xghcColsRows)
     299              : 
     300            4 :     write(std_out,*) "Transposer transpose back"
     301            4 :     call xgTransposer_transpose(xgTransposerGhc,STATE_LINALG)
     302              : 
     303            4 :     write(std_out,*) "ColsRows norm2"
     304            4 :     call xg_init(dotColsRows,SPACE_R,nband,1,xmpi_world)
     305            4 :     call xgBlock_colwiseNorm2(xghcLinalg,dotColsRows%self)
     306              :     !call xgBlock_print(dotColsRows%self,std_out)
     307              : 
     308            4 :     write(std_out,*) "Compare"
     309            4 :     call xgBlock_saxpy(dotLinalg%self, -1.0d0, dotColsRows%self)
     310            4 :     call xgBlock_reshape(dotLinalg%self,1,nband)
     311            4 :     call xgBlock_colwiseNorm2(dotLinalg%self,dotColsRows%self,max_val=maxdiff)
     312            4 :     write(std_out,"(a,f20.4)") " Difference: ",sqrt(maxdiff)
     313              : 
     314            4 :     write(std_out,*) "Free everything"
     315            4 :     call xg_free(dotLinalg)
     316            4 :     call xg_free(dotColsRows)
     317              : 
     318            4 :     call xgTransposer_free(xgTransposer)
     319            4 :     call xgTransposer_free(xgTransposerGh)
     320            4 :     call xgTransposer_free(xgTransposerGhc)
     321              : 
     322            4 :     ABI_FREE(cg)
     323            4 :     ABI_FREE(gh)
     324            4 :     ABI_FREE(ghc)
     325              : 
     326           12 :   end subroutine test2
     327              : !!***
     328              : 
     329              : !!****f* testTransposer/initVectors
     330              : !!
     331              : !! NAME
     332              : !! initVectors
     333              : !!
     334              : !! FUNCTION
     335              : !!
     336              : !! COPYRIGHT
     337              : !! Copyright (C) 1998-2026 ABINIT group (JB)
     338              : !! This file is distributed under the terms of the
     339              : !! GNU General Public License, see ~abinit/COPYING
     340              : !! or http://www.gnu.org/copyleft/gpl.txt .
     341              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     342              : !!
     343              : !! NOTES
     344              : !!
     345              : !! INPUTS
     346              : !!  (main routine)
     347              : !!
     348              : !! OUTPUT
     349              : !!  (main routine)
     350              : !!
     351              : !! SOURCE
     352              : 
     353              :   subroutine initVectors()
     354              :     integer, allocatable :: seed(:)
     355              :     integer :: n, iseed
     356              :     integer :: icol, irow
     357              : 
     358              :     call random_seed(size=n)
     359              :     ABI_MALLOC(seed,(n))
     360              :     do icol = 1, nband
     361              :       do iseed = 1, n
     362              :         seed(iseed) = (xmpi_comm_rank(xmpi_world)*nband+icol)*n+iseed
     363              :       end do
     364              :       call random_seed(put=seed)
     365              :       do irow = 1, npw
     366              :         call random_number(cg(:,(icol-1)*npw+1:icol*npw))
     367              :         call random_number(gh(:,(icol-1)*npw+1:icol*npw))
     368              :       end do
     369              :     end do
     370              :     ABI_FREE(seed)
     371              :   end subroutine initVectors
     372              : !!***
     373              : 
     374              : !!****f* testTransposer/backAndForth
     375              : !!
     376              : !! NAME
     377              : !! backAndForth
     378              : !!
     379              : !! FUNCTION
     380              : !!
     381              : !! COPYRIGHT
     382              : !! Copyright (C) 1998-2026 ABINIT group (JB)
     383              : !! This file is distributed under the terms of the
     384              : !! GNU General Public License, see ~abinit/COPYING
     385              : !! or http://www.gnu.org/copyleft/gpl.txt .
     386              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     387              : !!
     388              : !! NOTES
     389              : !!
     390              : !! INPUTS
     391              : !!  (main routine)
     392              : !!
     393              : !! OUTPUT
     394              : !!  (main routine)
     395              : !!
     396              : !! SOURCE
     397              : 
     398           16 :     subroutine backAndForth()
     399              : 
     400           16 :       maxt = 0
     401           16 :       cputime = 0
     402          336 :       do i=1,ncycle
     403          320 :         walltime = abi_wtime()
     404          320 :         call xgTransposer_transpose(xgTransposer,STATE_COLSROWS)
     405          320 :         if ( ncpucols > 1 ) then ! for 1 both states are aliased !!
     406            0 :           call random_number(cg)
     407              :         end if
     408              :         !call xgBlock_scale(xcgLinalg,0.d0,1)
     409              :         !call xgBlock_print(xgeigen,6)
     410          320 :         call xgTransposer_transpose(xgTransposer,STATE_LINALG)
     411              :         !call xgBlock_print(xgx0,6)
     412          320 :         call xmpi_barrier(xmpi_world)
     413          320 :         walltime = abi_wtime() - walltime
     414          320 :         cputime = cputime + walltime
     415          336 :         call xmpi_max(walltime,maxt,xmpi_world,ierr)
     416              :       end do
     417           16 :       call xmpi_max(cputime,maxt,xmpi_world,ierr)
     418           16 :       write(std_out,"(a,f20.5)") "-Mean time:  ", maxt/ncycle
     419    384000016 :       errmax = (sum(abs(cg0-cg)))/nband
     420           16 :       call xmpi_sum(errmax,xmpi_world,ierr)
     421           16 :       write(std_out,"(a,f20.14)") " Difference: ",errmax
     422           16 :       call xmpi_barrier(xmpi_world)
     423           16 :     end subroutine backAndForth
     424              : !!***
     425              : 
     426              : !!****f* testTransposer/printTimes
     427              : !!
     428              : !! NAME
     429              : !! printTimes
     430              : !!
     431              : !! FUNCTION
     432              : !!
     433              : !! COPYRIGHT
     434              : !! Copyright (C) 1998-2026 ABINIT group (JB)
     435              : !! This file is distributed under the terms of the
     436              : !! GNU General Public License, see ~abinit/COPYING
     437              : !! or http://www.gnu.org/copyleft/gpl.txt .
     438              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     439              : !!
     440              : !! NOTES
     441              : !!
     442              : !! INPUTS
     443              : !!  (main routine)
     444              : !!
     445              : !! OUTPUT
     446              : !!  (main routine)
     447              : !!
     448              : !! SOURCE
     449              : 
     450           16 :     subroutine printTimes()
     451              : 
     452              :       double precision :: total(2)
     453              :       integer :: ntot
     454           16 :       write(std_out,'(1x,a30,a8,a17,a17)') "counter", "calls", "cpu_time", "wall_time"
     455           16 :       ntot = 0
     456           16 :       total(:) = 0.d0
     457          144 :       do i=1662,1669
     458          128 :         call time_accu(i,ncount,times,nflops,ftimes)
     459          128 :         total(1) = total(1) + times(1)
     460          128 :         total(2) = total(2) + times(2)
     461          128 :         ntot = ntot + ncount
     462          144 :         write(std_out,'(a,a30,i8,2F17.3)') "-",trim(names(i-1661)), ncount, times(1), times(2)
     463              :       end do
     464           16 :       write(std_out,'(a,a30,i8,2F17.3)') "-","total", ntot, total(1), total(2)
     465           16 :       call timab(1,0,times)
     466              : 
     467           16 :     end subroutine printTimes
     468              : 
     469              : 
     470              :   end program testTransposer
     471              : !!***
        

Generated by: LCOV version 2.3-1