2016-08-29 7 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 

、出力は次のとおりです。?MTが0である理由私はそれが間違っているか何かを使用beacause

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

これは?この機能について

ドキュメント: https://software.intel.com/en-us/node/520863

PS:私はまだ 'アルファ' は何を意味するのか得ることはありません。

+1

を乗じた各要素は、この固定またはフリーフォーマットされたコードであることに注意してください。私はどのような位置で固定フォーマットされたコードの場合、 '呼び出し'の開始位置は1のように見え、少なくとも6の位置に移動します。 – albert

+0

サブルーチンの(明示的な)インターフェイスを指定する手段(モジュール、インクルードファイルなど)がありません。(上のコメントのように)サブルーチンは実際にはコメントではありません。 – francescalus

+0

固定の書式設定されたコードです。私は「ポジション1」を得られないことを申し訳なく思う。「コール」を一番下に移動すべきであることを意味するのだろうか? – Tau

答えて

1

ユーザーroygvibがコメントに示唆しているように、mkl.fiファイルを含めることで、さらに詳しい情報が得られます。エラー#6633:

このコード

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)を上昇させ、実際の引数の型は、仮引数の型と 異なります。 [9] mkl_domatcopy( "c"、 "t"、3,3,9、M、3、MT、3)を呼び出す -------------------- --------------------------- ^コンパイルがtest.f90で打ち切られました(コード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 

は、あなたのアプリケーションがmanual

アルファこのパラメータは、アルファによる入力行列をスケーリングと言い、何alpha手段に関して、

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

最後に返します。

と出力が転置され、9

+0

ありがとう。私は、あなたのexample.Andを見た後、どのように機能が動作するかをすぐに知っています。そして、ユーザーroygvibが示唆したようにテストしました。 – Tau

0

B = TRANSPOSE(A) 

を次のようにFORTRAN90に転置を行うための最速の方法であり、MATMULを行うための最速の方法は次のとおりです。

C = MATMUL(A,B) 

それは言語に固有のものであるとして、私はMKL/IMKLが出場する場所は不明ですか?

関連する問題