2016-08-29 2 views
0

Weiß jemand, warum Program B schneller als Program A ist?Zweimal Schleifen 1D mit verschiedenen Konfigurationen

benutzen ich ifort-16 mit -fast Optimierung Flagge und die Optimierung Berichte sagen, dass Program A geschätzte mögliche Geschwindigkeit 10.09 bis geben würde, während Program B nur 3,90. Aber eigentlich ist die Laufzeit von Program B 14s, während Program A 20s ist.

!Program A 
DO J=1, 100000   !This is the different part 
    !$OMP SIMD 
    DO I=1, 100000 
     IF(A(I)==J) THEN 
      B(I)=J 
     END IF   
    END DO 
    !$OMP END SIMD 
END DO 

!Program B 
DO I=1, 100000   !This is the different part 
    !$OMP SIMD 
    DO J=1, 100000 
     IF(A(I)==J) THEN 
      B(I)=J 
     END IF   
    END DO 
    !$OMP END SIMD 
END DO 

Nun wurden beide Programme erfolgreich vektorisiert und irgendwie sagt mein Gefühl, dass program A schneller sein würde, da (meiner Meinung nach) würden beide Codes vektorisiert werden, wie folgt:

!Program A 
IF(A(I)==J) THEN 
    B(I)=J 
END IF 

IF(A(I+1)==J) THEN 
    B(I+1)=J 
END IF 

... 

und

!Program B 
IF(A(I)==J) THEN 
    B(I)=J 
END IF 

IF(A(I)==J+1) THEN 
    B(I)=J+1 
END IF 

... 

wo Program A effektiver, ein seit den linken seitigen Indizes werden re direkt berechnet. Aber tatsächlich waren meine Erwartungen falsch. Danke im Voraus.

Antwort

1

Die Laufzeit eines Programms enthält viele Komponenten. Derjenige, den wir die meiste Zeit betrachten, ist die Rechenzeit. Allerdings haben wir auch den Speicherzugriff, der den Engpass der meisten Programme darstellt. Es gibt andere Komponenten, aber ich werde mich auf diese beiden beschränken. In Ihrem Fall ist der Speicherzugriff möglicherweise, was den Unterschied ausmacht.

In Programm B wird die interne Schleife (mit J Index), die den Zugriff 100000 die gleiche Speicherplatz A(I)B(I) und für jede Iteration der äußeren Schleife läuft (I Index). Sobald diese in Register geladen sind, ist es nicht mehr notwendig, in den Speicher zu gehen. Das Programm geht nur in den Speicher, wenn sich der Index I der äußeren Schleife ändert. Das heißt 100000 mal

In Programm A, die interne Schleife (mit I Index), die den Zugriff 100000 verschiedene Speicherstellen und A(I)B(I) für jede Iteration der inneren Schleife läuft. Da es keine Möglichkeit gibt, die 100000 in den Registern zu haben, muss die CPU auf die Daten warten. Und da die äußere Schleife (J Index) auch 100000 mal ausgeführt wird, haben Sie 100000x100000 Speicherzugriff für das Programm A im Vergleich zum 100000 für das Programm B.

Das ist eine mögliche Erklärung für das, was Sie beobachtet.

+1

Danke für die Antworten. Eigentlich dachte ich zuerst auch so. So besteht die Möglichkeit des Hauptproblems hier im Speicherzugriff. Ich habe es noch nicht mit 'Gfortran' getestet, aber hoffentlich bekomme ich dieselben Ergebnisse (Perspektiven), da manchmal' Ifort' und 'Gfortran' die verschiedenen Eigenschaften auch für einige einfache und grundlegende Probleme geben können. –

+0

Nur eine Seite dachte, Sie sollten in der Lage sein, eine Schleife zu beseitigen. Die beiden scheinen nicht notwendig zu sein. – innoSPG

+1

Ja sicher, ich brauche diese 2 Schleifen nicht. Alle Codes, die ich hier gepostet habe, sind nur ein paar einfache Beispiele, mit denen ich die Eigenschaften von 'Ifort' und' Gfortran' kennenlernen möchte. –

Verwandte Themen