[Parallel Computing Toolbox][parfor] partager un tableau
Bonjour à tous,
J'ai un algo qui explore et modifie un tableau NxN (N de l'ordre de 1000 à 10000) de proche en proche à partir d'une case de départ quelconque. pseudocode ci-dessous :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
L = 1 ; % une ligne de départ quelconque
C = 1 ; % une colonne de départ quelconque
while 1
if (la case courante n'a plus de voisin à traiter)
break
end
cherche tous les voisins non traités de (L,C)
modifie éventuellement ces voisins
choisit un des voisins (L1, C1) pour continuer l'algo
L = L1 ;
C = C1 ;
end |
Pour accélérer le traitement, Je veux exécuter 4 explorations du même tableau en parrallèle. Comme mentionné dans le pseudo-code, chaque exploration doit pouvoir lire et écrire dans le tableau.
Le code auquel je pense ressemblerait à ça :
Code:
1 2 3 4 5 6
| parfor depart = 1:4
[L, C] = case_de_depart (depart) ;
while 1
l'algo ci-dessus
end
end |
Matlab refuse.
je comprend un peu pourquoi (conflits entre lecture et écriture, etc.) en C, il faudrait utiliser des objets de synchronisation pour bloquer les parties du tableau en cours de lecture, par exemple.
j'ai déja prouvé que mon algo est adapté à ce type de parralélisation. La question n'est donc pas algorithmique, mais purement Matlabesque.
d'ou ma question : je peux faire une parrallélisation de ce genre avec Matlab (accessoirement, comment) ou bien j'oublie ?
un code de test pour illustrer
J'ai résumé le problème dans ce petit code :
Code:
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 |