Wir haben einen CFD-Löser und beim Ausführen einer Simulation wurde festgestellt, dass er auf einigen Computern außerordentlich langsam lief, auf anderen jedoch nicht. Bei Verwendung von Intel VTune wurde festgestellt, dass die folgende Zeile das Problem war (in Fortran):
RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))
Beim Einbohren mit VTune wurde das Problem zurückverfolgt call pow
Fließband und beim Verfolgen des Stapels zeigte es, dass es verwendet wurde __slowpow()
. Nach einigem Suchen, diese Seite tauchte auf und beschwerte sich über dasselbe.
Auf der Maschine mit der libc-Version 2.12 dauerte die Simulation 18 Sekunden. Auf der Maschine mit der libc-Version 2.14 dauerte die Simulation 0 Sekunden.
Basierend auf den Informationen auf der oben genannten Seite tritt das Problem auf, wenn die Basis zu pow()
liegt nahe bei 1,0. Also haben wir einen weiteren einfachen Test durchgeführt, bei dem wir die Basis um eine beliebige Zahl vor dem skaliert haben pow()
und dann durch die Zahl geteilt, die nach dem zum Exponenten erhoben wird pow()
Anruf. Dadurch sank auch bei der libc 2.12 die Laufzeit von 18 Sekunden auf 0 Sekunden.
Es ist jedoch unpraktisch, dies überall im Code zu platzieren, wo wir es tun a**b
. Wie würde man vorgehen, um die zu ersetzen pow()
Funktion in libc? Ich hätte zum Beispiel gerne das Fließband call pow
vom Fortran-Compiler generiert, um eine benutzerdefinierte Datei aufzurufen pow()
Funktion, die wir schreiben, die die Skalierung durchführt, ruft die libc auf pow()
und dividiert dann durch die Skalierung. Wie erstellt man eine für den Compiler transparente Zwischenschicht?
Bearbeiten
Zur Verdeutlichung suchen wir nach etwas wie (Pseudo-Code):
double pow(a,b) {
a *= 5.0
tmp = pow_from_libc(a,b)
return tmp/pow_from_libc(5.0, b)
}
Kann man die laden pow
aus libc und benennen Sie es in unserer benutzerdefinierten Funktion um, um Namenskonflikte zu vermeiden? Wenn die customPow.o
Datei umbenennen könnte pow
von libc, was passiert, wenn libc noch für andere Dinge benötigt wird? Würde das einen Namenskonflikt zwischen verursachen pow
in customPow.o
und pow
im libc?
Guter alter Fortran! Interessante Frage aber +1
– Austin Henley
14. Februar 2012 um 5:38 Uhr