Ich habe ein Fortran-Programm. Der Pseudo-Code wie folgt:Compiler-Optimierung auf loop-unabhängige Variablen
do x=1,nx
do y=1,ny
do z=1,nz
function(x,y,z)
end do
end do
end do
function(x,y,z)
if(var==1)
! do something
else if(var==2)
! do something else
end if
end
Hier wird die Variable var
von Input-Datei am Anfang des Programms gelesen wird und nicht im Verlauf der Ausführung ändern. Ich lese, dass eine if
Prüfung tief in for/do
Schleifen ist, kann es Leistung durch Ignorieren "Cache-Effekte" zu brechen. Da sich die Variable im Laufe der Zeit nicht ändert, kann der Compiler den Code so umordnen, dass die Vorteile des Cache-Effekts sichtbar sind.
Wenn dies nicht der Fall ist, wie vermeidet man die if
Prüfung oder bessere Möglichkeiten, ein solches Szenario zu implementieren?
So wie es aussieht, würde ich diese Frage wahrscheinlich "zu breit" nennen. Zwei Antworten, die beide das genaue Gegenteil sagen, sind wahrscheinlich gültig: Es gibt hier einfach zu viel Phantasie. Zum Beispiel sagen Sie, 'var' ändert sich nicht, aber ist es eine benannte Konstante oder hat es sogar das' volatile' Attribut? Ob der Compiler etwas abarbeiten kann, hängt vom Compiler ab (und ob dies möglich ist, hängt von den Compiler-Flags ab) und davon, wie der Code aufgebaut ist. Und der Nutzen kann von Ihrer Architektur und Verzweigungsvorhersage abhängen. Und so weiter. Ich schlage vor, Sie schreiben Ihr eigenes vollständiges Beispiel und profilieren es. – francescalus
Die Variable 'var' ist nicht konstant definiert. Aber lesen Sie aus einer Eingabedatei. Und der Umfang von "var" ist im gesamten Programm unverändert. –