Contenu principal

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

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.

Example MATLAB Code Analyzer messages indicating that parfor or spmd cannot be used inside another parfor loop and that the parfor-loop cannot run due to the way variable x is used.

Ce code montre les problèmes courants lorsque vous essayez de convertir des boucles for en boucles parfor.

Parfor-loop example code showing common problems, including using a noninteger as the parfor loop variable, using nested parfor loops, and making an iteration of a parfor-loop dependent on a previous iteration.

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 :

  1. 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,

    A(y) = A(y-1) + y;
    n'est pas indépendant et vous ne pouvez donc pas utiliser parfor . Pour connaître les prochaines étapes à suivre pour traiter les questions d’indépendance, voir Ensure That parfor-Loop Iterations Are Independent .

  2. Vous ne pouvez pas imbriquer une boucle parfor dans une autre boucle parfor. L'exemple comporte deux boucles for imbriquées, et vous ne pouvez donc remplacer qu'une seule boucle for par une boucle parfor. Au lieu de cela, vous pouvez appeler une fonction qui utilise une boucle parfor à l'intérieur du corps de l'autre boucle parfor. Cependant, de telles boucles parfor 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 .

  3. Les variables de boucle parfor doivent être des entiers consécutifs croissants. Dans l'exemple,

    parfor x = 0:0.1:1
    a des variables de boucle non entières, et par conséquent vous ne pouvez pas utiliser 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 boucle parfor, voir Assurez-vous que les variables de boucle parfor sont des entiers croissants consécutifs .

  4. Vous ne pouvez pas sortir prématurément d'une boucle parfor, comme vous le pouvez dans une boucle for. N'incluez pas d'instruction return ou break dans le corps de votre boucle parfor. Sans communication, les autres instances MATLAB exécutant la boucle ne savent pas quand s'arrêter. Comme alternative, envisagez parfeval .

    Si vous rencontrez toujours des problèmes lors de la conversion des boucles for en boucles parfor, 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 .

Voir aussi

| |

Rubriques