Variables temporaires
Une variable temporaire est toute variable qui est la cible d'une affectation directe non indexée, mais qui n'est pas une variable de réduction. Dans la boucle parfor
suivante, a
et d
sont des variables temporaires :
a = 0; z = 0; r = rand(1,10); parfor i = 1:10 a = i; % Variable a is temporary z = z + i; if i <= 5 d = 2*a; % Variable d is temporary end end
Contrairement au comportement d'une boucle for
, MATLAB® efface toutes les variables temporaires avant chaque itération d'une boucle parfor
. Pour garantir l’indépendance des itérations, les valeurs des variables temporaires ne peuvent pas être transmises d’une itération de la boucle à une autre. Par conséquent, les variables temporaires doivent être définies à l'intérieur du corps d'une boucle parfor
, afin que leurs valeurs soient définies séparément pour chaque itération.
MATLAB ne renvoie pas de variables temporaires au client. Une variable temporaire dans une boucle parfor
n'a aucun effet sur une variable portant le même nom qui existe en dehors de la boucle. Ce comportement est différent des boucles for
ordinaires.
Temporaires non initialisés
Les variables temporaires dans une boucle parfor
sont effacées au début de chaque itération. MATLAB peut parfois détecter des cas dans lesquels les itérations de boucle utilisent une variable temporaire avant qu'elle ne soit définie dans cette itération. Dans ce cas, MATLAB émet une erreur statique plutôt qu'une erreur d'exécution. Il est inutile de laisser l’exécution se poursuivre si une erreur d’exécution est inévitable. Ce type d'erreur survient souvent en raison d'une confusion entre for
et parfor
, notamment concernant les règles de classification des variables. Par exemple :
b = true; parfor i = 1:n if b && some_condition(i) do_something(i); b = false; end ... end
Cette boucle est acceptable comme une boucle for
ordinaire. Cependant, en tant que boucle parfor
, b
est une variable temporaire car elle apparaît directement comme cible d'une affectation à l'intérieur de la boucle. Il est donc effacé au début de chaque itération, son utilisation dans la condition if
est donc garantie d'être non initialisée. Si vous remplacez parfor
par for
, la valeur de b
suppose une exécution séquentielle de la boucle. Dans ce cas, do_something(i)
est exécuté uniquement pour les valeurs inférieures de i
jusqu'à ce que b
soit défini sur false
.
Variables temporaires destinées à être des variables réductrices
Une autre cause courante de temporaires non initialisés peut survenir lorsque vous avez une variable que vous vouliez être une variable de réduction. Cependant, si vous l'utilisez ailleurs dans la boucle, il est alors classé comme une variable temporaire. Par exemple :
s = 0; parfor i = 1:n s = s + f(i); ... if (s > whatever) ... end end
Si les seules occurrences de s
sont les deux de la première instruction du corps, s
serait classé comme une variable de réduction. Mais dans cet exemple, s
n'est pas une variable de réduction car elle a une utilisation en dehors des affectations de réduction dans la ligne s > whatever
. Parce que s
est la cible d'une affectation (dans la première instruction), il s'agit d'une affectation temporaire. Par conséquent, MATLAB génère une erreur, mais souligne le lien possible avec la réduction.
Si vous remplacez parfor
par for
, l'utilisation de s
en dehors de l'affectation de réduction repose sur les itérations effectuées dans un ordre particulier. Dans une boucle parfor
, il est important que la boucle « ne se soucie pas » de la valeur d’une variable de réduction au fur et à mesure de son exécution. Ce n'est qu'après la boucle que la valeur de réduction devient utilisable.
Variable ans
À l'intérieur du corps d'une boucle parfor
, la variable ans
est classée comme une variable temporaire. Toutes les considérations et restrictions relatives aux variables temporaires s'appliquent à ans
. Par exemple, les affectations à ans
à l'intérieur d'une boucle parfor
n'ont aucun effet sur ans
à l'extérieur de la boucle.