BLASに行列-行列乗算用の関数と行列-ベクトル乗算用gemm
の別個の関数があるのはなぜですか?gemv
行列とベクトルの乗算は、1つの行列に1つの行/列しかない行列と行列の乗算の特殊なケースではありませんか?
3 に答える
数学的には、行列とベクトルの乗算は行列と行列の乗算の特殊なケースですが、ソフトウェアライブラリで実現されているように、必ずしもそうであるとは限りません。
それらは異なるオプションをサポートします。たとえば、gemv
は、それが動作しているベクトルへのストライドアクセスをサポートしますが、gemm
ストライド行列レイアウトはサポートしません。C言語のバインディングでgemm
は、3つの行列すべての格納順序を指定する必要がありますがgemv
、ベクトル引数では意味がないため、これは不要です。
gemm
さまざまなオプションをサポートすることに加えて、に適用できない最適化のファミリーが実行される可能性がありますgemv
。行列とベクトルの積を実行していることがわかっている場合は、その場合に最適化されたコードパスに切り替える前に、ライブラリがその場合を理解するのに時間を無駄にしないようにします。代わりに直接呼び出す方がよいでしょう。
gemvとgemmを最適化する場合、さまざまな手法が適用されます。
- 行列-行列演算では、ブロックされたアルゴリズムを使用しています。ブロックサイズはキャッシュサイズによって異なります。
- 行列-ベクトル積を最適化するには、いわゆる融合レベル1演算(たとえば、融合ドット積または融合axpy)を使用します。
詳細が必要な場合はお知らせください。
レベル1(ベクトル-ベクトル)、レベル2(マトリックス-ベクトル)、レベル3(マトリックス-マトリックス)のルーチンを使用すると、BLAS階層によりよく適合すると思います。そして、それが単なるベクトルであることがわかっている場合は、もう少し最適化できるかもしれません。