Convertir les boucles for
en boucles parfor
Dans certains cas, vous devez modifier le code pour convertir les boucles for
en boucles parfor
. Cet exemple montre comment diagnostiquer et résoudre les problèmes de boucle parfor
à l'aide d'une simple boucle for
imbriquée. Exécutez ce code dans MATLAB® et examinez les résultats.
for x = 0:0.1:1 for y = 2:10 A(y) = A(y-1) + y; end end
Pour accélérer le code, essayez de convertir les boucles for
en boucles parfor
. Notez que ce code produit des erreurs.
parfor x = 0:0.1:1 parfor y = 2:10 A(y) = A(y-1) + y; end end
Dans ce cas, vous ne pouvez pas simplement convertir les boucles for
en boucles parfor
sans modification. Pour que cela fonctionne, vous devez modifier le code à plusieurs endroits. Pour diagnostiquer les problèmes, recherchez les messages de l'analyseur de code dans l'éditeur MATLAB.
Ce code montre les problèmes courants lorsque vous essayez de convertir des boucles for
en boucles parfor
.
Pour résoudre ces problèmes, vous devez modifier le code pour utiliser parfor
. Le corps de la boucle parfor
est exécuté dans un pool parallèle à l'aide de plusieurs workers MATLAB dans un ordre non déterministe. Par conséquent, vous devez répondre à ces exigences pour le corps de la boucle parfor
:
Le corps de la boucle
parfor
doit être indépendant. Une itération de boucle ne peut pas dépendre d’une itération précédente, car les itérations sont exécutées en parallèle dans un ordre non déterministe. Dans l'exemple,n'est pas indépendant et vous ne pouvez donc pas utiliserA(y) = A(y-1) + y;
parfor
. Pour connaître les prochaines étapes à suivre pour traiter les questions d’indépendance, voir Ensure That parfor-Loop Iterations Are Independent .Vous ne pouvez pas imbriquer une boucle
parfor
dans une autre boucleparfor
. L'exemple comporte deux bouclesfor
imbriquées, et vous ne pouvez donc remplacer qu'une seule bouclefor
par une boucleparfor
. Au lieu de cela, vous pouvez appeler une fonction qui utilise une boucleparfor
à l'intérieur du corps de l'autre boucleparfor
. Cependant, de telles bouclesparfor
imbriquées ne vous apportent aucun avantage informatique, car tous les workers sont utilisés pour paralléliser la boucle la plus externe. Pour obtenir de l’aide sur la gestion des boucles imbriquées, voir Boucles imbriquées parfor et for et autres exigences parfor .Les variables de boucle
parfor
doivent être des entiers consécutifs croissants. Dans l'exemple,a des variables de boucle non entières, et par conséquent vous ne pouvez pas utiliserparfor x = 0:0.1:1
parfor
ici. Vous pouvez résoudre ce problème en modifiant la valeur de la variable de boucle en valeurs entières requises par l'algorithme. Pour les étapes suivantes du dépannage des variables de boucleparfor
, voir Assurez-vous que les variables de boucle parfor sont des entiers croissants consécutifs .Vous ne pouvez pas sortir prématurément d'une boucle
parfor
, comme vous le pouvez dans une bouclefor
. N'incluez pas d'instruction return ou break dans le corps de votre boucleparfor
. Sans communication, les autres instances MATLAB exécutant la boucle ne savent pas quand s'arrêter. Comme alternative, envisagezparfeval
.Si vous rencontrez toujours des problèmes lors de la conversion des boucles
for
en bouclesparfor
, consultez Dépannage des variables dans les boucles parfor .
Conseil
Vous pouvez profiler une boucle parfor
en utilisant tic
et toc
pour mesurer l'accélération par rapport à la boucle for
correspondante. Utilisez ticBytes
et tocBytes
pour mesurer la quantité de données transférées vers et depuis les workers du pool parallèle. Pour plus d'informations et d'exemples, voir Profiling parfor-loops .