Frage

Ich habe beginnend Fortran (95) für einigen numerischen Code zu verwenden (Erzeugen von Python-Modulen). Hier ist ein einfaches Beispiel:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

Ich habe festgestellt, dass diese sehr gut in 32 Bit führt, aber wenn sie als x86_64 kompiliert es ist etwa 5-fach langsamer (macbook pro core2duo, Schneeleopard, gfortran 4.2.3 von r.research.att.com). Ich stellte schließlich das sein könnte wegen Verwendung von 32-Bit-Integer-Typ anstelle der nativen Typ, und in der Tat, wenn ich mit integer ersetzen * 8, die 64-Bit-Leistung nur 25% schlechter als die 32-Bit ist.

Warum wird unter Verwendung eines 32-Bit-Integer so viel langsamer auf einer 64-Bit-Maschine? Gibt es implizite Abgüsse mit der Indizierung los, dass ich nicht bewusst sein mag?

Ist es immer der Fall, dass 64-Bit für diese Art von Code langsamer als 32 Bit sein wird (ich davon überrascht wurde) - oder ist es eine Chance, ich konnte die 64-Bit-kompilierte Version erhalten die gleiche Geschwindigkeit oder schneller laufen?

( Hauptfrage ) Gibt es eine Möglichkeit, eine (integer) Variable zu deklarieren, die 'native' Typ zu sein ... also 32 Bit, wenn 32-Bit kompiliert, 64 Bit, wenn 64-Bit kompiliert in moderne fortran. Ohne dieser scheint es, wie es unmöglich ist, tragbaren Fortran-Code zu schreiben, die nicht viel langsamer sein werden, je nachdem, wie sein zusammengestellt - und ich denke, das bedeutet, dass ich zu werden mit Fortran für mein Projekt zu stoppen. Ich habe in Art und selected_kind aussehen, aber nicht in der Lage, etwas zu finden, das dies tut.

[Edit:. Der große Leistung Hit war von der f2py Wrapper Kopieren des Array aus 64-Bit-int zu 32-Bit-int zu werfen, so dass nichts inhärent den Fortran]

War es hilfreich?

Lösung

Die Antwort auf Ihre ‚Hauptfrage‘ ist die richtige Compiler-Option wählen Sie den Standard ganze Zahl mit 32 oder 64 Bit erklärt zu haben. Ich habe nie gfortran verwenden (ich ziehe g95, noch besser ein Bezahl-Compiler), damit ich gegoogelt und es scheint, dass -fdefault-integer-8 ist die Option, die Sie benötigen.

Wie Sie, ich bin überrascht, dass die 64-Bit-Version ist langsamer als die 32-Bit-Version. Ich habe nichts an diesem Punkt zu beleuchten.

Andere Tipps

Wirklich hat auch versucht, einen 64-Bit mit watfor 77 laufen, aber ich war völlig impossible.I bekam einen gf-FOR-Compiler für meinen 64-Bit und versuchte, einige Optionen auf Google an Verwendung später eine Option gegeben gcc zu verwenden -mp 4.3 und gfortran 4.3. Version, die war immer noch langsam. Ich werde beraten Sie verwenden, um eine 32-Bit-Maschine, die compactible Fortran ist Ihre Programme oder De-grade Ihre 64-Bit auf 32-Bit laufen Ihre progs schneller und genauer auszuführen. Lassen Sie halten auf die Erforschung, um eine 64-Bit-Maschine zu bekommen runing campactibly mit WATFOR77 und Subroutinen progs.

Während ich nicht sorgfältige Untersuchungen durchgeführt habe, habe ich nicht so große Geschwindigkeitsunterschiede zu sehen.

Ich schlage vor, versucht, eine neuere Version von gfortran. Version 4.2 ist früher (gfortran begann mit 4.0) und als veraltet angesehen. 4.3 und 4.4 sind sehr verbessert und mehr Funktionen haben. 4.4 ist die aktuelle Nicht-Beta-Version. Eine einfache Möglichkeit, sie auf einem Mac zu erhalten, ist über MacPorts: die gcc43 und gcc44 Pakete beinhalten gfortran. Die Compiler als gcc-mp-4.3 installiert ist, gfortran-mp-4.3, usw., um nicht mit anderen Versionen in Konflikt geraten. Oder Sie können versuchen, die neueste Version von 4.5 von der gfortran Wiki-Seite.

Intel Fortran ist manchmal deutlich schneller als gfortran.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top