Differences between revisions 3 and 7 (spanning 4 versions)
Revision 3 as of 2012-04-17 10:46:19
Size: 3564
Editor: NicoleThomas
Comment:
Revision 7 as of 2012-04-24 12:01:05
Size: 5255
Editor: NicoleThomas
Comment:
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:
 * clamsmix_set_config    * '''clamsmix_set_config'''
Line 15: Line 15:
 * clamsmix_set_bounds  * '''clamsmix_set_bounds '''
Line 19: Line 19:
  * in messy_clamsmix.f90   * in messy_clamsmix.f90 
Line 24: Line 24:
 * clamsmix_sort  * '''clamsmix_sort'''
Line 32: Line 32:
  || status || || OUT || Fehlercode ||
  || level || (dnparts) || IN || Level (ZETA-Werte)||
  || indarr || (dnparts) || OUT || sortierter Index von levelind||
  || irange || (2,l_nthetas,0:ntasks-1) || OUT || Start- und Endposition jedes Levels im sortierten Feld <<BR>> irange(1,i,k): Erster Punkt auf Level i in levelind(indarr) auf PE k <<BR>> irange(2,i,k): Letzter Punkt auf Level i in levelind(indarr) auf PE k||
  || levelind || (dnparts) || LOKAL || Index der ZETA-Werte in ZETA-Grid||
  || status   || integer || || OUT || Fehlercode ||
  || level  || real(prec) || (dnparts) || IN || Level (ZETA-Werte)||
  || indarr || integer || (dnparts) || OUT || sortierter Index von levelind||
  || irange   || integer || (2,l_nthetas,0:ntasks-1) || OUT || Start- und Endposition jedes Levels im sortierten Feld <<BR>> irange(1,i,k): Erster Punkt auf Level i in levelind(indarr) auf PE k <<BR>> irange(2,i,k): Letzter Punkt auf Level i in levelind(indarr) auf PE k||
  || levelind || integer || (dnparts) || LOKAL || Index der ZETA-Werte in ZETA-Grid||
Line 60: Line 60:
 * clamsmix_nparts_per_level  * '''clamsmix_nparts_per_level '''
Line 67: Line 67:
   * irange (2,l_nthetas,0:ntasks-1), IN
   * dnparts_level(l_nthetas,0:ntasks-1), OUT, Anzahl Punkte pro Level für jede PE
   * nparts_level(l_nthetas), OUT, Anzahl Punkte pro Level auf allen PEs
  || irange        || integer || (2,l_nthetas,0:ntasks-1) || IN  || Start- und Endposition jedes Levels für jede PE||
  || dnparts_level || integer || (l_nthetas,0:ntasks-1)   || OUT || Anzahl Punkte pro Level für jede PE ||
  || nparts_level || integer || (l_nthetas)              || OUT || Anzahl Punkte pro Level auf allen PEs ||
Line 71: Line 71:
 * clamsmix_set_level  * '''clamsmix_set_level '''
Line 77: Line 77:
  * Wenn mehr CPUs als Level genutzt werden, bearbeiten die ersten nthetas CPUs jeweils ein Level, die weiteren bleiben ungenutzt
  * Bei weniger CPUs als Level wird die Anzahl Punkte möglichst gleichmäßig auf die CPUs verteilt: <<BR>>
  Es wird solange jeweils das nächste Level hinzugefügt, bis die Anzahl der Punkte auf der aktuellen CPU möglichst nah an nparts/ntasks und die Gesamtzahl der bisher zugeteilten Punkte möglichst nah an (nparts/ntasks)*(irank+1) liegt.
Line 78: Line 81:
   * nparts_level(l_nthetas), IN, Anzahl Punkte pro Level auf allen PEs
   * levelrange(2,0:ntasks-1), OUT, Start- und Endlevel für jede PE
  || nparts_level || integer || (l_nthetas)   || IN  || Anzahl Punkte pro Level auf allen PEs ||
  || levelrange   || integer || (2,0:ntasks-1)|| OUT || Start- und Endlevel für jede PE ||
Line 82: Line 85:
 * clamsmix_shuffle  * '''clamsmix_shuffle'''
Line 90: Line 93:
   || status || integer || OUT || Fehlercode ||
   || my_nparts || integer || OUT || neue Anzahl Punkte auf aktueller PE||
   || indarr || integer (dnparts) || IN || ||
   || irange || integer (2,l_nthetas,0:ntasks-1)|| IN || ||
   || levelrange || integer (2,0:ntasks-1) || IN || ||
   || dnparts_level|| integer (l_nthetas,0:ntasks-1) || IN || ||
   || nparts_level || integer (l_nthetas) || IN || ||
   || level || real(prec)|| IN || Level (ZETA-Werte) ||
   || infield || real(prec)|| IN || Umzuordnender Parameter ||
   || outfield || real(prec)|| OUT || Umgeordneter Parameter ||
   || status || integer   || || OUT || Fehlercode ||
   || my_nparts || integer   || || OUT || neue Anzahl Punkte auf aktueller PE||
   || indarr || integer   || (dnparts) || IN || ||
   || irange || integer   || (2,l_nthetas,0:ntasks-1)|| IN || ||
   || levelrange || integer   || (2,0:ntasks-1) || IN || ||
   || dnparts_level|| integer   || (l_nthetas,0:ntasks-1) || IN || ||
   || nparts_level || integer   || (l_nthetas) || IN || ||
   || level || real(prec)|| (dnparts_max) || IN || Level (ZETA-Werte) ||
   || infield || real(prec)|| (dnparts_max) || IN || Umzuordnender Parameter ||
   || outfield || real(prec)|| (dnparts_max) || OUT || Umgeordneter Parameter ||
Line 101: Line 104:
 * mix
  * Jede PE schreibt die Daten, die von ihr selbst bearbeitet werden, zuerst auf outfield
  * Jede PE empfängt von allen anderen die Punkte, die auf den von der PE zu bearbeitenden Leveln liegen, und hängt diese an outfield an
  * Jede PE sendet an alle anderen PEs die Punkte, die auf den von dieser zu bearbeitenden Leveln liegen
  * Falls Unterintervalle für mix gewählt wurden (nintervals>1) müssen noch Punkte aus den Grenzbereichen ausgetauscht werden. Diese werden jeweils auf zwei aufeinanderfolgenden PEs benötigt: <<BR>>
  Von der vorhergehenden PE müssen die Punkte zwischen theta_min_act und l_min_act noch geholt werden. Von der nachfolgenden PE müssen die Punkte zwischen l_max_act und theta_max_act noch geholt werden.
  * setze die aktuelle Anzahl Punkte auf der jeweiligen PE ->my_nparts


 * '''mix'''

messy_clamsmix_si.f90

sub. clamsmix_global_end

  • clamsmix_set_config

    SUBROUTINE clamsmix_set_config
    • in messy_clamsmix.f90
    • Setze von mix benötigte Variablen:
      • adapt_par, time_step, nthetas, l_nthetas, theta_min, theta_max
  • clamsmix_set_bounds

      SUBROUTINE clamsmix_set_bounds 
    • in messy_clamsmix.f90
    • Setze die Grenzen für jedes Level:
      • theta_min_act, theta_max_act, theta_delta_act, l_min_act, l_max_act, l_delta_act
  • clamsmix_sort

     SUBROUTINE clamsmix_sort (status, level, indarr, irange)
    • Indexsortierung des Levels (ZETA)
    • Variablen

      status

      integer

      OUT

      Fehlercode

      level

      real(prec)

      (dnparts)

      IN

      Level (ZETA-Werte)

      indarr

      integer

      (dnparts)

      OUT

      sortierter Index von levelind

      irange

      integer

      (2,l_nthetas,0:ntasks-1)

      OUT

      Start- und Endposition jedes Levels im sortierten Feld
      irange(1,i,k): Erster Punkt auf Level i in levelind(indarr) auf PE k
      irange(2,i,k): Letzter Punkt auf Level i in levelind(indarr) auf PE k

      levelind

      integer

      (dnparts)

      LOKAL

      Index der ZETA-Werte in ZETA-Grid

    • Ermittle zu jedem ZETA-Wert den Index im ZETA-Grid -> levelind

    • Indexsortierung des Feldes levelind -> indarr

    • Ermittle den ersten und letzten Punkt jedes Levels in levelind(indarr) -> irange

      ipart      1    2    3    4    5    6    7    8    9
       
      level     320  330  325  340  322  331  332  342  mdi
      
      levelind   1    2    1    3    1    2    2    3   9999
      
      indarr     1    3    5    2    6    7    4    8    9
      
      levelind   1    1    1    2    2    2    3    3   9999
      (indarr)
      
      irange      (1,3)          (4,6)         (7,8)
  • clamsmix_nparts_per_level

      SUBROUTINE clamsmix_nparts_per_level (irange, dnparts_level, nparts_level)
    • in messy_clamsmix.f90
    • Ermittle die Anzahl Punkte pro Level
    • Parameter:

      irange

      integer

      (2,l_nthetas,0:ntasks-1)

      IN

      Start- und Endposition jedes Levels für jede PE

      dnparts_level

      integer

      (l_nthetas,0:ntasks-1)

      OUT

      Anzahl Punkte pro Level für jede PE

      nparts_level

      integer

      (l_nthetas)

      OUT

      Anzahl Punkte pro Level auf allen PEs

  • clamsmix_set_level

      SUBROUTINE clamsmix_set_level (levelrange, nparts_level)
    • in messy_clamsmix.f90
    • Ermittle für jede PE, welche Level bearbeitet werden
    • Wenn mehr CPUs als Level genutzt werden, bearbeiten die ersten nthetas CPUs jeweils ein Level, die weiteren bleiben ungenutzt
    • Bei weniger CPUs als Level wird die Anzahl Punkte möglichst gleichmäßig auf die CPUs verteilt:
      Es wird solange jeweils das nächste Level hinzugefügt, bis die Anzahl der Punkte auf der aktuellen CPU möglichst nah an nparts/ntasks und die Gesamtzahl der bisher zugeteilten Punkte möglichst nah an (nparts/ntasks)*(irank+1) liegt.

    • Parameter:

      nparts_level

      integer

      (l_nthetas)

      IN

      Anzahl Punkte pro Level auf allen PEs

      levelrange

      integer

      (2,0:ntasks-1)

      OUT

      Start- und Endlevel für jede PE

  • clamsmix_shuffle

       SUBROUTINE clamsmix_shuffle (status, my_nparts, indarr, irange, levelrange, &
                            dnparts_level, nparts_level, level, infield, outfield)
    • Umsortierung der Punkte:
      • Jede PE bekommt alle Punkte, deren Level zwischen levelrange(1,irank) and levelrange(2,irank) liegt
    • Parameter

      status

      integer

      OUT

      Fehlercode

      my_nparts

      integer

      OUT

      neue Anzahl Punkte auf aktueller PE

      indarr

      integer

      (dnparts)

      IN

      irange

      integer

      (2,l_nthetas,0:ntasks-1)

      IN

      levelrange

      integer

      (2,0:ntasks-1)

      IN

      dnparts_level

      integer

      (l_nthetas,0:ntasks-1)

      IN

      nparts_level

      integer

      (l_nthetas)

      IN

      level

      real(prec)

      (dnparts_max)

      IN

      Level (ZETA-Werte)

      infield

      real(prec)

      (dnparts_max)

      IN

      Umzuordnender Parameter

      outfield

      real(prec)

      (dnparts_max)

      OUT

      Umgeordneter Parameter

    • Jede PE schreibt die Daten, die von ihr selbst bearbeitet werden, zuerst auf outfield
    • Jede PE empfängt von allen anderen die Punkte, die auf den von der PE zu bearbeitenden Leveln liegen, und hängt diese an outfield an
    • Jede PE sendet an alle anderen PEs die Punkte, die auf den von dieser zu bearbeitenden Leveln liegen
    • Falls Unterintervalle für mix gewählt wurden (nintervals>1) müssen noch Punkte aus den Grenzbereichen ausgetauscht werden. Diese werden jeweils auf zwei aufeinanderfolgenden PEs benötigt:
      Von der vorhergehenden PE müssen die Punkte zwischen theta_min_act und l_min_act noch geholt werden. Von der nachfolgenden PE müssen die Punkte zwischen l_max_act und theta_max_act noch geholt werden.

    • setze die aktuelle Anzahl Punkte auf der jeweiligen PE ->my_nparts

  • mix

  • Punkte wieder gleichmäßig auf CPUs verteilen

messy/mix (last edited 2013-02-18 09:00:01 by NicoleThomas)