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
parfordoit ê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
parfordans une autre boucleparfor. L'exemple comporte deux bouclesforimbriquées, et vous ne pouvez donc remplacer qu'une seule boucleforpar 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 bouclesparforimbriqué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
parfordoivent ê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:1parforici. 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
foren 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 .