parfor_ex2.m 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. % - exemple de boucle parallèle: parfor
  2. % - les itérations sont indépendantes, l'efficacité est donc optimale(!)
  3. %
  4. %
  5. N = 200;
  6. M = 400;
  7. a = zeros(N,1);
  8. tic; % serial (regular) for-loop
  9. % calcul séquentiel
  10. for i = 1:N
  11. a(i) = a(i) + max(eig(rand(M)));
  12. end
  13. time(1) = toc;
  14. fprintf('temps sequentiel: %f \n', time(1));
  15. % Usage de la Parallel Computing Toolbox:
  16. %
  17. % Les fonctionnalités parallèle (parfor, parfeval, spmd ...)
  18. % nécessite l'initialisation d'un "pool de workers" via
  19. % la commande "parpool"
  20. %
  21. % - le nombre de workers ne peut être supérieur au nombre de cœurs
  22. % - le nombre de workers par défaut est le nombre de coeurs
  23. % demandés (et max 12) , par conséquent si les ressources demandées
  24. % via OAR sont supérieures à 12 , il faut forcer l'usage de
  25. % ces ressources:
  26. %
  27. % exemple (manuellement):
  28. % - parpool(16)
  29. % - (avec 16 cœurs demandés: OAR -l /nodes=1/core=16,walltime=00:20)
  30. %
  31. % exemple 2 (mieux?): récupération du nombre de ressources via une
  32. % variable d'environnement du SHELL passée par exemple dans le
  33. % script de soumission du jobs
  34. %
  35. % - export number_Threads=16
  36. %
  37. % Remarque: l'instruction "parpool" est facultative: elle est implicitement
  38. % lancée dès que l'interpréteur rencontre une instruction propre
  39. % à la Parallèle ToolBox - par ex. parfor - ... (mais le nombre
  40. % de workers sera dans ce cas au plus 12)
  41. %
  42. % cf. https://fr.mathworks.com/help/distcomp/parpool.html
  43. % Selon la solution adoptée plus haut:
  44. if (isempty(getenv('number_Threads')))
  45. %nb de thread fixé manuellement mais qui...
  46. % doit être inférieur aux ressources/coeurs demandés!!
  47. nbcore = 8
  48. else
  49. % lecture de la variable SHELL number_Threads
  50. nbcore = uint8(str2num(getenv('number_Threads')))
  51. end
  52. % initialisation du pool de workers
  53. parpool(nbcore)
  54. tic;
  55. % parallel for-loop
  56. parfor i = 1:N
  57. a(i) = a(i) + max(eig(rand(M)));
  58. end
  59. time(2) = toc;
  60. speedup = time(1)/time(2);
  61. fprintf('temps execution parallele : %f \n', time(2));
  62. fprintf('acceleration du parallelisme: %f \n', speedup);
  63. % Pour infos, si on désire connaître/manipuler les propriétés
  64. % d'un pool (NumWorkers, AttachedFiles,SpmdEnabled etc.),
  65. % il faut utiliser la fonction "get current pool" (gcp), ex:
  66. % recuperer les propriétes du pool courant:
  67. p = gcp('nocreate');
  68. fprintf('le nombre de workers est: %d \n',p.NumWorkers);
  69. %delete(gcp('nocreate'))
  70. % merci de quitter matlab pour libérer les jetons de licence.
  71. quit