spmd_ex4_int_trapeze.m 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. % Calculs Parallèles avec la Parallel Toolbox
  2. % - mise en oeuvre de spmd (Single Program Multiple Data)
  3. % (spmd ~ une version simplifiée de MPI "sauce Matlab")
  4. %
  5. % Program spmd_ex4_int_trapeze.m:
  6. % - Calcul intégral par la méthode des trapèzes.
  7. % https://fr.wikipedia.org/wiki/Méthode_des_trapèzes
  8. %
  9. %
  10. % Remarque: il s'agit d'un programme exemple ... car en matlab
  11. % les deux lignes suivantes suffisent !!! ;-) :
  12. %
  13. % f=@(x) 4./(1+x.^2);
  14. % Q=integral(f,0,1)
  15. %function value = spmd_ex4_int_trapeze(n)
  16. % cf tutoriaux parfor_ex2.m: si le nombre de ressources est
  17. % supérieur à 12, il faut forcer le pool.
  18. % le script oar matlab_ex4_lauch.oar demande 16 coeurs via
  19. % la variable d environnement number_Threads
  20. if (~isempty(getenv('number_Threads')))
  21. % parpool(16)
  22. parpool(uint8(str2num(getenv('number_Threads'))))
  23. else
  24. % rien, le pool est initialisé au nb de coeurs demandés
  25. end
  26. %p = gcp;
  27. %p.NumWorkers
  28. n=100;
  29. % cf matlab anonymous function. (ici, (4 x) dérivé de arctan pour le calcul de pi)
  30. f = @(x) 4./(1+x.^2)
  31. fprintf ( 1 , 'calcul des bornes \n');
  32. spmd
  33. a = ( labindex -1 ) / numlabs ;
  34. b = labindex/ numlabs ;
  35. fprintf ( 1, 'le Lab %d travaille sur l intervalle [% f ,% f] \n',labindex ,a ,b ) ;
  36. end
  37. fprintf ( 1 , 'chaque workers calcule son aire locale \n') ;
  38. spmd
  39. x = linspace ( a ,b ,n );
  40. fx = f(x);
  41. formule_de_quadrature = ( b - a ) * ( (fx(1) + fx(n))/2 + sum ( fx(2:n-1) ))/(n-1);
  42. fprintf ( 1 , ' Approximation partielle %f \n', formule_de_quadrature) ;
  43. end
  44. %approximation = sum ( formule_de_quadrature{:} ) ;
  45. approximation = sum(cellfun(@double,formule_de_quadrature(:,:)));
  46. fprintf ( 1, 'Approximation de pi = %f \n', approximation);
  47. % merci de quitter matlab proprement pour libérer correctement les jetons
  48. quit