parfor_print_ex3.m 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. % - ex boucle parallèle: parfor
  2. % - les itérations sont indépendantes, l'efficacité est donc optimale(!)
  3. % - En revanche, les itérations sur le nombre de threads (1, 2, 4, 8)
  4. % sont réalisées avec l'initialisation/réinitialisation d'un pool
  5. % de coeur à chaque itération (parpool(nb_coeurs)): cette opération est
  6. % lourde en temps...mais nécessaire car Matlab utilise par défaut le
  7. % nombre max de coeurs alloués/demandés: la fonction maxNumCompThreads est
  8. % inopérante dans un parfor.
  9. N = 200;
  10. M = 400;
  11. a = zeros(N,1);
  12. core(1)= 1;
  13. speedup(1)=1;
  14. tic; % serial (regular) for-loop
  15. % calcul séquentiel
  16. for i = 1:N
  17. a(i) = a(i) + max(eig(rand(M)));
  18. end
  19. time(1) = toc;
  20. for j = 2:5
  21. %maxNumCompThreads will be removed in a future release ...but replace by?
  22. %
  23. core(j) = 2^(j-1); % 1,2,4,8...
  24. parpool(core(j));
  25. fprintf('nombre de threads: %d \n', core);
  26. tic; % parallel for-loop
  27. parfor i = 1:N
  28. a(i) = a(i) + max(eig(rand(M)));
  29. end
  30. time(j) = toc;
  31. speedup(j) = time(1)/time(j);
  32. delete(gcp('nocreate'))
  33. end
  34. % En mode batch, les figures doivent être sauvées dans des fichiers
  35. fig = figure;
  36. plot(core,core,core,speedup,'-*');
  37. title(' Speedup parfor (exemple 1) : 1,2,..,16 coeurs ');
  38. xlabel('nombre de coeurs');
  39. ylabel('Speedup = T_{coeurs} / T_{sequentiel}');
  40. % sauve figure-20161028-11-24.png
  41. print(fig, strcat('figure-',datestr(now,'yyyymmdd-HH-MM')),'-dpng');
  42. % merci de quitter matlab pour libérer les jetons de licence.
  43. quit