1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| % la fonction test_parfor tente de parcourir un même tableau par deux itératreurs parrallèles et concurrents.
% L'un part du haut, vers le bas. L'autre pars du bas, vers le haut.
% Lorsqu'ils se rejoignent, le traitement s'arrête.
% MATLAB refuse ce type de parrallélisation. Ce refus est bien documenté :
% ??? Error: File: test_parfor.m Line: 31 Column: 9
% The variable M in a parfor cannot be classified.
% See Parallel for Loops in MATLAB, "Overview".
% Ma question : comment implémenter dans Matlab ce type d'itérateurs multiples et concurrents ?
% Note : certainement pas avec un parfor puisque c'est écrit noir sur blanc que ce n'est pas possible. Alors comment ?
function test_parfor()
% le tableau à parcourir
M = rand(1, 1000) ;
% comment chaque thread va explorer le tableau M
start = [1, 1000] ;
stop = [1000, 1] ;
direction = [+1, -1] ;
threads = 2 ;
current = zeros(1, threads) ;
parfor t = 1:threads
for u = start(t):direction(t):stop(t)
current(t) = u ; % publie la position courante du thread courant
switch t % détermine le numéro de "l'autre" thread
case 1, autre = 2 ;
case 2, autre = 1 ;
end
% termine le thread si l'autre a déja fini
if u * direction(t) > current(autre) * direction (t) % si mon thread a dépassé l'autre
break
end
% traite le nombre courant
M(u) = touch (M, u) ;
end
end
end
% un exemple rudimentaire de traitement d'une case
function X = touch (Table, index)
X = max(0.999, Table(index)) ;
end |
Partager