2016-08-29 7 views
1

Ich muss einen schnelleren Weg finden, eine Matrix mit MKL zu transponieren. Und ich habe mkl_domatcopy von MKL ausprobiert, aber nie richtig verstanden. HierWie verwende ich mkl_domatcopy von MKL?

ist der Testcode (Fortran):

 PROGRAM MAIN 

       INTEGER, PARAMETER:: NROW = 3 !rows 
       INTEGER, PARAMETER:: NCOL = 3 !cols 

       REAL*8, ALLOCATABLE:: M(:,:) 
       REAL*8, ALLOCATABLE:: MT(:,:) 

       INTEGER:: i,j 

       ALLOCATE(M(NROW,NCOL)) 
       ALLOCATE(MT(NROW,NCOL)) 


       DO i = 1, NROW 
       DO j = 1, NCOL 
         M(i,j)=i 
       END DO 
       END DO 

call mkl_domatcopy("c","t",3,3,9,M,3,MT,3) 

       print *,M 
       print *,"************************" 
       print *,MT 

     END 

Und der Ausgang ist:

1.00000000000000  2.00000000000000  3.00000000000000 
    1.00000000000000  2.00000000000000  3.00000000000000 
    1.00000000000000  2.00000000000000  3.00000000000000 
************************ 
      0 

warum die MT 0 Ist es beacause ich es falsch oder etwas verwenden?

Dokumente zu dieser Funktion: https://software.intel.com/en-us/node/520863

PS: ich immer noch nicht bekommen, was 'Alpha' bedeutet.

+1

Ist der fixe oder freier formatiertem Code. Bei fest formatiertem Code an der Position, an der der Aufruf beginnt, sieht er wie Position 1 aus, verschiebe ihn auf mindestens Position 6. – albert

+0

Nehmen wir an (wie im obigen Kommentar), dass es sich wirklich um einen Unterprogrammaufruf handelt, der kein Kommentar ist. Verfügen Sie nicht über einige Mittel (Modul, Include-Datei usw.) zur Angabe der (expliziten) Schnittstelle für das Unterprogramm? – francescalus

+0

Es ist fester formatierter Code. Es tut mir leid, dass ich nicht "Position 1" bekomme. Bedeutet das, dass ich den "Call" nach unten verschieben sollte? – Tau

Antwort

1

Wie Benutzer roygvib in den Kommentaren schlägt, indem Sie die mkl.fi Datei hinzufügen, würden Sie zusätzliche Details geben.

Dieser Code

PROGRAM MAIN 

      INCLUDE 'mkl.fi' 

      INTEGER, PARAMETER:: NROW = 3 !rows 
      INTEGER, PARAMETER:: NCOL = 3 !cols 

      REAL*8, ALLOCATABLE:: M(:,:) 
      REAL*8, ALLOCATABLE:: MT(:,:) 
      INTEGER:: i,j 

      ALLOCATE(M(NROW,NCOL)) 
      ALLOCATE(MT(NROW,NCOL)) 

      DO i = 1, NROW 
      DO j = 1, NCOL 
        M(i,j)=i 
      END DO 
      END DO 

      call mkl_domatcopy("c","t",3,3,9,M,3,MT,3) 

      print *,M 
      print *,"************************" 
      print *,MT 

    END 

wirft folgende Fehler

test.f90 (23): Fehler # 6633: Der Typ des aktuellen Argument unterscheidet vom Typ des Scheinargument. [9] Aufruf mkl_domatcopy ("c", "t", 3,3,9, M, 3, MT, 3) -------------------- ---------------------------^Kompilierung abgebrochen für test.f90 (Code 1)

Interessanterweise, wenn Sie das drehen 9 in einen Wert mit doppelter Genauigkeit (oder Variable) - beachte, dass ich hier einfach das d0 Suffix an den Gleitkommawert angehängt habe.

PROGRAM MAIN 

      INCLUDE 'mkl.fi' 

      INTEGER, PARAMETER:: NROW = 3 !rows 
      INTEGER, PARAMETER:: NCOL = 3 !cols 

      REAL*8, ALLOCATABLE:: M(:,:) 
      REAL*8, ALLOCATABLE:: MT(:,:) 
      INTEGER:: i,j 

      ALLOCATE(M(NROW,NCOL)) 
      ALLOCATE(MT(NROW,NCOL)) 

      DO i = 1, NROW 
      DO j = 1, NCOL 
        M(i,j)=i 
      END DO 
      END DO 

      call mkl_domatcopy("c","t",3,3,9d0,M,3,MT,3) 

      print *,M 
      print *,"************************" 
      print *,MT 

    END 

dann Ihre Anwendung zurückgibt

$ ./test 
1.00000000000000  2.00000000000000  3.00000000000000 
1.00000000000000  2.00000000000000  3.00000000000000 
1.00000000000000  2.00000000000000  3.00000000000000 
************************ 
9.00000000000000  9.00000000000000  9.00000000000000 
18.0000000000000  18.0000000000000  18.0000000000000 
27.0000000000000  27.0000000000000  27.0000000000000 

schließlich in Bezug auf das, was alpha Mittel, die manual sagt

alpha Dieser Parameter stellt die Eingangsmatrix durch alpha skaliert.

und feststellen, dass die Ausgabe der tranposed ist und jedes Element multipliziert mit 9.em

+0

Danke. Ich weiß sofort, wie die Funktion funktioniert, nachdem ich dein Beispiel gesehen habe. Und ich habe getestet, was der Benutzer roygvib vorschlägt und es hat funktioniert. – Tau

0

Der schnellste Weg, um eine Transponierung in Fortran90 ist zu tun, wie

folgt
B = TRANSPOSE(A) 

und den schnellsten Weg, um eine MATMUL zu tun ist:

C = MATMUL(A,B) 

Wie es in der Sprache inhärent ist, ich bin nicht sicher, wo MKL/IMKL ins Spiel kommt?