2016-07-29 25 views
0

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?

+0

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

+0

Die Variable 'var' ist nicht konstant definiert. Aber lesen Sie aus einer Eingabedatei. Und der Umfang von "var" ist im gesamten Programm unverändert. –

Antwort

0
do x=1,nx 
    do y=1,ny 
    if (var == 1) 
     do z=1,nz 
     function1(x,y,z) 
     end do 
    else if (var == 2) 
     do z=1,nz 
     function2(x,y,z) 
     end do 
    endif 
    end do 
end do 
+0

Ich weiß, das wäre die logische Lösung. Aber die "Funktion" an sich ist sehr lang und hat viele andere Funktionen. Der 'if'-Check ist nur eine kleine Komponente der' Funktion'. Daher würde das Schreiben von zwei Funktionen unnötigerweise die Codelänge erhöhen. Irgendwelche anderen Vorschläge? –

+1

@SathishKrishnan Wenn die Funktion sehr lang ist, gibt es keinen Grund, das 'if' zu vermeiden, das ist eine nutzlose Mikrooptimierung. –