web-dev-qa-db-ja.com

BLAS dgemmでのLDA引数の目的は?

Fortranリファレンス実装ドキュメントには次のように記載されています。

*  LDA    - INTEGER.
*           On entry, LDA specifies the first dimension of A as declared
*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
*           least  max( 1, k ).
*           Unchanged on exit.

しかし、mとkが与えられた場合、LDAを導出することはできませんか? LDAがn(またはk)より大きくなることが許可されるのはいつですか?

41
Setjmp

違いは、配列AとBの最初の次元の論理サイズと物理サイズの違いです。 1つ目は使用している配列のサイズ、2つ目は宣言の値、つまり使用されているメモリの物理量です。 Fortranは列の主要言語であるため、配列要素の位置を計算するには、最後のインデックスを除くすべてのインデックスの宣言されたサイズを知る必要があります。 「A(LDA、)、B(LDB、)、C(LDC、*)」のFORTRAN77スタイル宣言に注意してください。配列の宣言されたサイズは、使用している部分よりも大きくなる可能性があります。もちろん、小さくすることはできません。

21
M. S. B.

BLASのLDAパラメータは、線形メモリに配置されているため、事実上マトリックスのストライドです。操作されている行列の先頭の次元よりも大きいLDA値を持つことは完全に有効です。より大きなLDA値を使用することが有用または必要な典型的なケースは、より大きな密行列からサブ行列を操作している場合、およびストレージが最適なサイズの倍数にパディングされている場合にハードウェアまたはアルゴリズムがパフォーマンス上の利点を提供する場合です(キャッシュラインまたはGPUメモリトランザクションサイズ、またはマルチプロセッサ実装の負荷分散など)。

40
talonmies

LDAのもう1つの見方は、yストライドです。これは、行優先レイアウトでは、要素A [y、x]のアドレスがx + LDA * yとして計算されることを意味します。 xデータLDA = xSizeの隣接する行の間にギャップのない「パックされた」メモリレイアウトの場合。

7