2016-08-29 52 views
1

我需要找到一種使用MKL轉置矩陣的更快方法。我嘗試了MKL的mkl_domatcopy,但從來沒有把它做對。如何從MKL正確使用mkl_domatcopy?

下面是測試代碼(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 

,輸出是:

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

爲什麼MT是0它是東陽我使用它錯了或什麼?

文檔關於此功能: https://software.intel.com/en-us/node/520863

PS:我還沒有得到什麼 '阿爾法' 的意思。

+1

這是固定的或自由格式化的代碼。我在固定格式化代碼的情況下,「呼叫」開始的位置看起來像位置1,移動到至少位置6。 – albert

+0

假設(如上面的註釋中所述)確實是子例程調用而不是註釋,那麼您是否沒有指定子例程的(顯式)接口的方法(模塊,包含文件等)? – francescalus

+0

它是固定格式的代碼。對不起,我沒有得到'位置1'。這是否意味着我應該將'呼叫'移動到底部? – Tau

回答

1

正如用戶roygvib在評論中建議的那樣,通過包含mkl.fi文件會給你更多的細節。

此代碼

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 

引發以下錯誤

test.f90(23):錯誤#6633:類型實際參數的從僞參數的種類而不同 。 [9] call mkl_domatcopy(「c」,「t」,3,3,9,M,3,MT,3) -------------------- ---------------------------^compilation aborted for test.f90(code 1)

有趣的是,如果你把那個將9轉換爲雙精度值(或變量) - 請注意,在此我簡單地將d0後綴附加到浮點值。

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 

那麼你的應用程序返回

$ ./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 

最後,就什麼alpha手段,在manual

阿爾法此參數縮放的α輸入矩陣。

並注意輸出是tranposed並且每個元素乘以9.

+0

Thanks.I在看到您的示例後立即知道該函數是如何工作的。我已經測試了roygvib用戶的建議,並且它確實有效。 – Tau

0

做轉置在FORTRAN90的最快方法是如下

B = TRANSPOSE(A) 

並做MATMUL最快的方法是:

C = MATMUL(A,B) 

由於它固有的語言,我不確定MKL/IMKL在哪裏發揮作用?