[petsc-users] DMSetLabelValue takes a lot of time for large domain

Danyang Su danyang.su at gmail.com
Wed Apr 25 16:12:23 CDT 2018


On 2018-04-25 09:47 AM, Matthew Knepley wrote:
> On Wed, Apr 25, 2018 at 12:40 PM, Danyang Su <danyang.su at gmail.com 
> <mailto:danyang.su at gmail.com>> wrote:
>
>     Hi Matthew,
>
>     In the worst case, every node/cell may have different label.
>
> Do not use Label for this. Its not an appropriate thing. If every cell 
> is different, just use the cell number.
> Labels are for mapping a relatively small number of keys (like 
> material IDs) to sets of points (cells, vertices, etc.)
> Its not a great data structure for a permutation.
Yes. If there is small number of keys, it runs very fast, even for more 
than one million DMSetLabelValue calls. The performance just 
deteriorates as the number of keys increases.

I cannot get avoid of DMSetLabelValue as node/cell index of original 
mesh is needed for the previous input file that uses some of global 
node/cell index to set value. But if I can get the natural order of 
nodes/cells from DMPlex, I can discard the use of DMSetLabelValue. Is 
there any function can do this job?

Thanks,

Danyang
>
> However, I still do not believe these numbers. The old code does a 
> string comparison every time. I will setup a test.
>
>    Matt
>
>     Below is one of the worst scenario with 102299 nodes and 102299
>     different labels for test. I found the time cost increase during
>     the loop. The first 9300 loop takes least time (<0.5) while the
>     last 9300 loops takes much more time (>7.7), as shown below. If I
>     use larger mesh with >1 million nodes, it runs very very slowly in
>     this part. The PETSc is configured with optimization on.
>
>     Configure options --with-cc=gcc --with-cxx=g++ --with-fc=gfortran
>     --download-mpich --download-scalapack --download-parmetis
>     --download-metis --download-ptscotch --download-fblaslapack
>     --download-hypre --download-superlu_dist --download-hdf5=yes
>     --download-ctetgen --with-debugging=0 COPTFLAGS="-O3 -march=native
>     -mtune=native" CXXOPTFLAGS="-O3 -march=native -mtune=native"
>     FOPTFLAGS="-O3 -march=native -mtune=native"
>
>     istart 	iend 	progress 	CPU_Time 	time cost - old (sec) 	time cost
>     - new (sec)
>     0 	9299 	0 	1524670045.51166 	
>     	
>     9300 	18599 	0.100010753 	1524670045.99605 	0.4843890667 	0.497246027
>     18600 	27899 	0.200010747 	1524670047.32635 	1.330302 	1.3820912838
>     27900 	37199 	0.300010741 	1524670049.3066 	1.9802515507
>     2.2439446449
>     37200 	46499 	0.400010765 	1524670052.1594 	2.852804184 	3.0739262104
>     46500 	55799 	0.500010729 	1524670055.90961 	3.7502081394
>     3.9270553589
>     55800 	65099 	0.600010753 	1524670060.47654 	4.5669286251
>     4.7571902275
>     65100 	74399 	0.700010777 	1524670066.0941 	5.6175630093
>     5.7428796291
>     74400 	83699 	0.800010741 	1524670072.53886 	6.44475317 	6.5761549473
>     83700 	92998 	0.900010765 	1524670079.99072 	7.4518604279
>     7.4606924057
>     92999 	102298 	1 	1524670087.71066 	7.7199423313 	8.2424075603
>
>
>
>     old code
>
>             do ipoint = 0, istart-1
>               !c output time cost, use 1 processor to test
>               if (b_enable_output .and. rank == 0) then
>                 if (mod(ipoint,iprogress) == 0 .or. ipoint ==
>     istart-1) then
>                   !write(*,'(f3.1,1x)',advance="no") (ipoint+1.0)/istart
>                   write(*,*) ipoint,
>     (ipoint+1.0)/istart,"time",MPI_Wtime()
>                 end if
>               end if
>
>               call DMSetLabelValue(dmda_flow%da,"cid_lg2g",ipoint, &
>                                    ipoint+1,ierr)
>               CHKERRQ(ierr)
>             end do
>
>
>     new code
>
>             call DMCreateLabel(dmda_flow%da,'cid_lg2g',ierr)
>             CHKERRQ(ierr)
>
>             call DMGetLabel(dmda_flow%da,'cid_lg2g',label, ierr)
>             CHKERRQ(ierr)
>
>             do ipoint = 0, istart-1
>               !c output time cost, use 1 processor to test
>               if (b_enable_output .and. rank == 0) then
>                 if (mod(ipoint,iprogress) == 0 .or. ipoint ==
>     istart-1) then
>                   !write(*,'(f3.1,1x)',advance="no") (ipoint+1.0)/istart
>                   write(*,*) ipoint,
>     (ipoint+1.0)/istart,"time",MPI_Wtime()
>                 end if
>               end if
>
>               call DMLabelSetValue(label,ipoint,ipoint+1,ierr)
>               CHKERRQ(ierr)
>             end do
>
>     Thanks,
>
>     Danyang
>
>     On 2018-04-25 03:16 AM, Matthew Knepley wrote:
>>     On Tue, Apr 24, 2018 at 11:57 PM, Danyang Su
>>     <danyang.su at gmail.com <mailto:danyang.su at gmail.com>> wrote:
>>
>>         Hi All,
>>
>>         I use DMPlex in unstructured grid code and recently found
>>         DMSetLabelValue takes a lot of time for large problem, e.g.,
>>         num. of cells > 1 million. In my code, I use
>>
>>
>>     I read your code wrong. For large loop, you should not use the
>>     convenience function. You should use
>>
>>         DMPlexCreateFromCellList ()
>>
>>
>>     DMGetLabel(dm, name, &label)
>>
>>
>>         Loop over all cells/nodes{
>>
>>         DMSetLabelValue
>>
>>
>>     Replace this by DMLabelSetValue(label, point, val)
>>
>>         }
>>
>>         DMPlexDistribute
>>
>>         The code works fine except DMSetLabelValue takes a lot of
>>         time for large problem. I use DMSetLabelValue to set material
>>         id for all the nodes or cells so that each subdomain has a
>>         copy of material id. Is there any other functions that can be
>>         used more efficient, e.g. set labels by array, not 1 by 1?
>>
>>
>>     That should take much less time.
>>
>>       Thanks,
>>
>>          Matt
>>
>>         Thanks,
>>
>>         Danyang
>>
>>
>>
>>
>>     -- 
>>     What most experimenters take for granted before they begin their
>>     experiments is infinitely more interesting than any results to
>>     which their experiments lead.
>>     -- Norbert Wiener
>>
>>     https://www.cse.buffalo.edu/~knepley/
>>     <http://www.caam.rice.edu/%7Emk51/>
>
>
>
>
> -- 
> What most experimenters take for granted before they begin their 
> experiments is infinitely more interesting than any results to which 
> their experiments lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/%7Emk51/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180425/47f14f8b/attachment-0001.html>


More information about the petsc-users mailing list