2017-02-21 8 views
1

Ich glaube nicht, dass die folgende Fortran Schleife do concurrent gültig ist, wie acc in jeder Iteration geändert wird. Allerdings gibt gfortran keine Warnung, und der resultierende Wert in acc ist korrekt bei 55. Ist es gültig oder nicht?Ist die folgende 'Fortran' Gleichlaufschleife gültig?

integer :: acc, i 
acc = 0 
do concurrent (i=1:10) 
    acc = acc + i 
end do 
+0

Beachten Sie, dass der Compiler nicht * erforderlich * ist, um eine gleichzeitige Schleife zu vektorisieren oder zu parallelisieren; der gleichzeitige Teil garantiert dem Compiler nur, dass die Vektorisierung/Parallelisierung sicher ist (was in diesem Fall falsch ist). Bei vielen Compilern wird 'do concurrent' daher einfach durch eine normale' do'-Schleife ersetzt; Da Ihr Code die richtige Antwort gegeben hat, hat Ihr Compiler das wahrscheinlich getan. – jabirali

Antwort

2

Die Schleife ist in der Tat nicht gültig. Der Compiler muss dies nicht erkennen und in diesem Fall den Grund melden.

in Fortran 2008 8.1.6.5 ('Beschränkungen auf DO CONCURRENT Konstrukte') haben wir als eine Einschränkung:

Eine Variable, die in einer Iteration referenziert wird entweder zuvor während dieser Iteration definiert werden oder müssen nicht definiert sein oder während irgendeiner anderen Iteration undefiniert werden. Eine Variable, die durch mehr als eine Iteration definiert wird oder nicht definiert wird, wird beim Beenden der Schleife undefiniert.

acc ist solch eine Variable, die (die auf der linken Seite einer intrinsischen Zuordnungsanweisung) um mehr als eine Iteration (alle) definiert werden. Die Schleife ist also schlecht (und am Ende der Schleife ist das Konstrukt acc undefiniert, so dass es ebenfalls ungeeignet ist, den Wert zu überprüfen).

+1

Die Probleme werden möglicherweise erst angezeigt, wenn Sie die automatische Parallelisierung aufgerufen haben. – tim18