XL Fortran for AIX V8.1.1

ランゲージ・リファレンス

MATMUL(MATRIX_A, MATRIX_B, MINDIM)

マトリックス乗算を実行します。

引き数タイプおよび属性

MATRIX_A
ランクが 1 または 2 で、データ型が数値または論理の配列です。

MATRIX_B
ランクが 1 または 2 で、データ型が数値または論理の配列です。これは MATRIX_A とは異なる数値タイプの場合もありますが、 1 つの数値マトリックスに 1 つの論理マトリックスという使い方はできません。

+----------------------------------IBM 拡張----------------------------------+

MINDIM (オプション)
Strassen アルゴリズムの Winograd 変分 (大きなマトリックスに対しては速い場合がある) を使用してマトリックス乗算を実行するかどうかを決定する整数です。このアルゴリズムは、サブマトリックスのエクステントが MINDIM よりも小さくなるまで、オペランドのマトリックスを 4 つのほぼ等しい部分に再帰的に分割します。
注:
Strassen の方式は、入力マトリックスのある一定の行または列の位取りに対して安定ではありません。したがって、互いに異なる指数値を持つ MATRIX_A と MATRIX_B に対して Strassen の方式を使用すると、不正確な結果が出る場合があります。

MINDIM の値の意味は次のとおりです。

<=0
Strassen アルゴリズムをまったく使用しません。これはデフォルトです。

1
将来の利用に備えて予約されています。

>1
引き数配列内のすべての次元の最小のエクステントがこの値以上であれば Strassen アルゴリズムを再帰的に適用します。 MINDIM の最適値は、マシンの構成、使用可能なメモリー、そして配列の大きさ、タイプ、および kind タイプによって異なるため、最適なパフォーマンスを得るにはこの値をさまざまに変更して試してみなければなりません。

デフォルトでは、MATMUL は、マトリックス乗算の従来の O(N**3) 方式を採用します。

libpthreads.a ライブラリーをリンクすると、O(N**2.81) Strassen 方式の Winograd 変分を次の条件下で採用します。

  1. MATRIX_A と MATRIX_B は、両方とも整数か、または複素数であり、同じ kind タイプを持ちます。
  2. プログラムは、エクステント N の正方行列のための、約 (2/3)*(N**2) 個のエレメントを保持するのに必要十分な一時ストレージを割り振ることができます。
  3. MINDIM 引き数は、MATRIX_A と MATRIX_B のすべてのエクステントの最小よりも小さいか等しくなります。

+--------------------------------IBM 拡張の終り-------------------------------+

最低でも 1 つの引き数のランクを 2 にしなければなりません。 MATRIX_B の唯一のまたはその最初の次元は、MATRIX_A の唯一のまたは最後の次元に等しくなければなりません。

クラス

変換関数

結果値

結果は配列になります。いずれかの引き数のランクが 1 であれば、結果のランクは 1 になります。両方の引き数のランクが 2 であれば、結果のランクは 2 になります。

結果のデータ型は、表 3 および 表 4 に記載されている規則に従って、引き数のデータ型によって異なります。

MATRIX_A と MATRIX_B のデータ型が数値の場合は、結果の配列エレメントは次のようになります。

エレメントの値 (i,j) = SUM( (MATRIX_A の行 i) * (MATRIX_B の列 j) )

MATRIX_A と MATRIX_B のデータ型が論理タイプの場合は、結果の配列エレメントは次のようになります。

エレメントの値 (i,j) = ANY( (MATRIX_A の行 i) .AND. (MATRIX_B の列 j) )

! A is the array  | 1 2 3 |, B is the array | 7 10 |
!                 | 4 5 6 |                 | 8 11 |
!                                           | 9 12 |
   RES = MATMUL(A, B)
! The result is |  50   68 |
!               | 122  167 |

+----------------------------------IBM 拡張----------------------------------+

! HUGE_ARRAY and GIGANTIC_ARRAY in this example are
! large arrays of real or complex type, so the operation
! might be faster with the Strassen algorithm.
 
   RES = MATMUL(HUGE_ARRAY, GIGANTIC_ARRAY, MINDIM=196)

+--------------------------------IBM 拡張の終り-------------------------------+

+----------------------------------IBM 拡張----------------------------------+

関連情報

-qessl コンパイラー・オプションが使用されている場合、コンパイラーは Fortran 実行時ライブラリーではなく、 ESSL ライブラリーを使用しようとします。詳細については、「ユーザーズ・ガイド」を参照してください。

マトリックス乗算に対する Strassen の方式の数値的安定度については、以下の資料に記述されています。

「Exploiting Fast Matrix Multiplication Within the Level 3 BLAS」、 Nicholas J. Higham, ACM Transactions on Mathematical Software, Vol. 16, No. 4, December 1990.
「GEMMW: A portable level 3 BLAS Winograd variant of Strassen's matrix-matrix multiply algorithm」、Douglas, C. C., Heroux, M., Slishman, G., and Smith, R. M., Journal of Computational Physics, Vol. 110, No. 1, January 1994, pages 1-10.

+--------------------------------IBM 拡張の終り-------------------------------+


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]