Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


doc:user:advanced:parallel

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:user:advanced:parallel [2015/10/28 15:01] jorisdoc:user:advanced:parallel [2025/11/25 08:23] (current) – [Read the details] boman
Line 1: Line 1:
-====== Calcul parallèle ======+====== Parallel computing ======
  
-===== Quand utiliser le parallélisme? =====+Metafor can be run in parallel on several cores of your computer, but this is not done automatically. By default Metafor uses a single core for the calculation (and another one for the visualisation when it is enabled).
  
-Metafor n'est pas complètement parallélisé. Néanmoins, il est possible d'effectuer certaines parties du calcul en parallèle (ALE et solveur linéaire actuellement). +===== Run Metafor with several threads =====
  
-Pour voir si votre test peut bénéficier du parallèleil est utile d'aller jeter un oeil sur le fichier \\ ''workspace/votretest/timers.txt''+To enable parallelismyou should prescribe the number of threads by adding a ''-k'' flag to the command line: for example: 
 +  Metafor -k 4 
 +starts Metafor with 4 threads.
  
-Voila ce que ca donne par exemple:+If you use the graphical user interface and you want to double click on the icon, you can duplicate the shortcut on the desktop (click on it, then CTRL-C, CTRL-V to make a copy). Rename it to "Run Parallel Metafor". Then right-click on the icon and go to properties. Add ''-k 4'' to the end of the "target" line: 
 +{{:doc:user:advanced:parallel_metafor.png|}} 
 +Then click OK.
  
-^ ^  user  ^  real ^  kernel ^  omp  ^ +Doucle-click on the new icon and check that 4 threads are enabled: 
-|''GEN_EXT_FORC''   |  43.0095| 43.848| 0.0156001| 43.9277| +{{:doc:user:advanced:parallel_metafor_2.png|}}
-|''GEN_INERT_FORC''   |  93.117|  93.723 |  0 |  93.896 +
-|''GEN_INTER_FORC''  |  247.059 |  250.334 |0.0156001 |  250.814| +
-|''Metafor''   |  2166.25 |2229.01 |  6.33364 |  __2233.16__| +
-|''buildK''       474.758 |  479.521 |  0.0156001 |  480.42| +
-|''contactDetection'' 95.0514 |  96.386 |  0.0156001 |  96.5679| +
-|''prepro'' |  82.8209 |  90.388 |  0.436803 |  90.5551| +
-|''solveK'' |  858.505 |  874.956 |  1.71601 |  __876.568__|+
  
-Chaque colonne est un compteur du temps CPU. Regardons le compteur OpenMP (dernière colonne). On voit ici que le solveur (ligne "''solveK''") dure 876s sur les 2233s du calcul. En utilisant 2 CPUs, on peut diviser le temps solveur par un peu moins d'un facteur 2. on peut s'attendre donc à un gain CPU total de l'ordre de 438s sur ce test (ligne "''Metafor''").+===== Change your python file =====
  
-Dans ce cas précis, c'est pas terrible mais si votre test est plus gros et que votre temps solveur avoisine les 90% du temps CPU total, ca peut valoir le coup de continuer à lire cette page... 
  
 +In order to take advantage of parallel loops, you must do 2 things:
 +  * you must use a parallel linear solver
 +  * you must explicitly enable parallel loops in your python file
 +
 +==== Use a parallel linear solver ====
    
  
 +The default linear solver is a basic sequential solver. Change the linear solver used to solve each linear system at each iteration with:
 +
 +  solman = metafor.getSolverManager()
 +  solver = DSSolver()
 +  solman.setSolver(solver)
 +
 +==== Activate parallel loops ====
 +
 +Add these lines anywhere in your python file after the line ''from wrap import *'':
 +
 +  StrVectorBase.useTBB()
 +  StrMatrixBase.useTBB()
 +  ContactInteraction.useTBB()
 +
 +The first line enable the parallel assembly of vectors. The second line does the same for matrices.
 +The third line activates parallel contact management.
 +
 +These 3 lines will display 3 blocks of messages such as this one:
 +
 +  \**************************************************
 +   WARNING: StrVectorBase::useTBB(true):            
 +    Structural vectors will be computed in parallel.
 +    However, some combinations of elements/algorithms
 +    are NOT thread safe yet!
 +    => Erroneous results / program crash may occur!.
 +  \**************************************************
 +
 +This is the normal behaviour. Some parts of Metafor are not thread-safe yet. However, if you are using classical commands, algorithms and methods of Metafor, enabling parallelism is totally safe.
  
-===== Principe général =====+Anyway you must keep in mind that parallel calculations are not performed in the same order each time you run the problem. It means that parallel results are not reproductible. You can obtain slightly different results when running Metafor twice on the same test. This is a common behaviour in parallel solvers.
  
-<note important>Commandes pas à jours, on dirait qu'un certain LPX a fait du renaming sans changer la doc... :-P Voir page [[commit:2015:08_25 
-]] </note> 
  
-Il s'agit de parallélisation [[http://openmp.org/wp/|OpenMP]]. D'une part, une partie du code C++ de Metafor est parallélisé et, d'autre part, les opérations BLAS (y compris les solveurs parallèles MKL) utilisent également OpenMP.+===== Read CPU times =====
  
-Dans Metaforles objets statiques ''Blas'' et ''OpenMP'' permettent de configurer le comportement d'OpenMP respectivement dans le code C++ et dans les routines Blas/MKL. Pour voir la config courante, il faut utiliser +During the calculationCPU times are displayed at the beginning of each time step: for example:
-  OpenMP.status() +
-  Blas.status() +
-ceci est fait au démarrage de Metafor à titre informatif.+
  
-On peut aussi changer le nombre de threads utilisés par OpenMP en écrivant directement dans le jeu de données: +  \*** STEP 9t= 0.000149616 - dt= 4.3125e-05 - CPU= 1m24.97s/41.54s
-  OpenMP.setNumThreads(n) +
-  Blas.setNumThreads(n) +
-où ''n'' est le nombre de threads voulusIl est également possible de ne configurer que Blas/MKL ou que le code C++. +
-===== Exécution dans un Metafor.exe =====+
  
-Les commandes précédentes s'écrivent simplement dans le jeu de données (n'importe où). Néanmoins, pour éviter de fixer définitivement le nombre de threads d'un modèle, il est possible de ne pas modifier le jeu de données et d'utiliser plutôt le flag "-j nde ''Metafor.exe'': +The first time is the "CPU time"This is the sum of the calculation times spent in each core of your CPUThis timer runs much faster than the "wall-clock time", which is the second time displayed.
-  Metafor.exe -j 2 -run montest +
-qui lance ''montest.py'' avec 2 threads (C++ et Blas/MKL)+
  
-Par défautsans ce flagle nombre de threads est __toujours initialisé à 1__ par ''Metafor.exe'', quelles que soient les valeurs des variables d'environement OpenMP et Blas/MKL+Thusif you want to compare 2 simulationskeep track of the wall-clock time (the smallest time displayed, also named ''Real CPU time'') which is the real time spent running the calculation.
  
-Pourquoi? Simplement parce que les valeurs par défaut MKL et OpenMP ne sont pas identiques! Par exemple, sur une machine avec 4 coeurs hyperthreadés, on aura un nombre fixe de 8 threads pour le code OpenMP/C++ de Metafor alors que Blas/MKL en allouera un nombre variable entre 1 et 4 (en fonction de la charge machine!!).+  [TSC-CPU]                           User CPU Time : 47.1562 
 +  [TSC-REA]                           Real CPU Time : 12.979 
 +  [TSC-KER]                         Kernel CPU Time : 3.35938
  
-===== Exécution sous python externe =====+The third time (kernel) is the CPU time spent by parallel management routines and other system calls. This time is included in the "Real CPU time".
  
-Metafor peut également être lancé à l'aide d'un ''python.exe'' traditionnel. C'est par exemple le cas de la batterie.  +===== Read the details =====
-Dans ce cas particulier mais relativement courant, on est dans un environnement externe a priori inconnu (éventuellement même dans un autre programme qui possède une interface python!!). Aucune initialisation n'est donc effectuée pour ne pas interférer avec l'interpréteur inconnu. On se retrouve alors avec le comportement "classique" de OpenMP: le nombre de threads est fixé par la variable ''OMP_NUM_THREADS'' et ''MKL_NUM_THREADS''. Par exemple: +
-  set OMP_NUM_THREADS=+
-  set MKL_NUM_THREADS=+
-  set MKL_DYNAMIC=+
-  python montest2.py +
-lance ''montest2.py'', qui utilise Metafor, dans un interpréteur traditionnel avec les paramètres par défaut de Metafor. La variable ''MKL_DYNAMIC'' permet d'avoir "n" threads Blas quelle que soit la charge de la machine.+
  
-Par défaut, on a donc le comportement qui peut sembler "bizarre" et qui est décrit ci-dessus où, sur une machine avec 4 coeurs hyperthreadés, tous les coeurs seront utilisés, mais de manière différente par le code C++ et la bibliothèque MKL.+The time spent in each part of the code is summarized in ''timers.txt''. You will find this file in the workspace of your test at the end of the calculation.
  
-===== En résumé =====+If you are interested in analysing the efficiency of your model, you can have a look at its contents (it is a table similar to this one):
  
-  * Le nombre de threads utilisé par défaut pour ''Metafor.exe'' vaut (pas de parallélisation) +^ ^user ^real ^kernel^ 
-  * Le nombre de threads est fixé par l'option "-j" de ''Metafor.exe'' +|GEN_EXT_FORC_TXTYTZ |3.78125 |0.15 |0.109375| 
-  * Sous python (et la batterie notamment), le nombre de threads n'est pas initialiséIl peut être fixé +|GEN_INTER_FORC_TXTYTZ |2.9375 |0.572 |0.0625| 
-     * soit via les variables d'environnement \\ (''OMP_NUM_THREADS=n'', ''MKL_NUM_THREADS=n'', ''MKL_DYNAMIC=0'') +|Metafor |47.1562 |12.983 |3.35938| 
-     * soit directement dans le jeu de données \\ (''OpenMP.setNumThreads(n); Blas.setNumThreads(n);'')+|ObjectiveFunction |0| 0| 0| 
 +|ValuesManager |0.96875 |0.594| 0.109375| 
 +|buildK_TXTYTZ |12.5156 |1.737| 0.78125| 
 +|contactDetection |7.6875 |1.888 |0.296875| 
 +|prepro |0.390625 |0.731 |0.328125| 
 +|saveFacs |0.21875 |0.17 |0.015625| 
 +|solveK_TXTYTZ |12.5469 |1.883 |0.796875| 
 +|steps |0.75 |0.675 |0.046875|
  
-<note tip>Il serait possible d'ajouter un paramètre à la batterie (''battery.py'') pour spécifier le nombre de threads par test. Par exemple: "''battery.py -j 4 -k 2''" pourrait par exemple lancer 4 tests en parallèle, chacun sur 2 CPUs...  </note> 
  
- --- //[[romain.boman@gmail.com|Romain BOMAN]] 2010/12/13 11:54// 
  
doc/user/advanced/parallel.1446040884.txt.gz · Last modified: (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki