sgemm の netlib ドキュメントには、配列がストライドLDA
し、 であるLDB
必要があり>= 1
、列が重ならないように十分な大きさである必要があると記載されています。実際、Apple の Accelerate/veclib フレームワークの実装では、これらの条件がチェックされ、違反している場合は存在します。
この制限が存在する理由が本当にわかりません。BLAS は、私がストライド ゼロまたは負のストライドを本当に望んでいると単純に信じることはできませんか? 私が理解している限り、Fortran 整数はデフォルトで署名されているため、パラメーターの型が理由ではないようです (免責事項: Fortan はよくわかりません)。
実際、非正の配列ストライドの非常に合理的な使用例が存在します。
- ゼロ ストライド: 多次元配列クラスでは、ゼロのストライドは numpy スタイルのブロードキャストを有効にします。
- 負のストライド: ストライドを無効にすると、コピーせずに任意の軸に沿って配列を逆順に表示できます。これは、たたみ込みカーネルを反転する場合などに役立ちます。たたみ込みは、 gemm を使用して効率的に実装できます。別の方法として、画像の垂直軸を反転することもできます。これは、さまざまな規則が存在するため便利です: Postscript/pdf では上向き軸、png 形式 (およびその他の多く) では下向き軸。
私は2つの側面に興味があります:
- 制限が存在する理由を理解したいと思います。BLASの設計者がそのようなユースケースを考えていなかったからですか?私は、実際に機能であるバグを見つけようとする誰かの犠牲者ですか? それとも、制限によってパフォーマンスが向上しますか? 後者を想像するのは難しい。
- (あまり) パフォーマンスを犠牲にすることなく、制限を回避する方法はありますか? 今のところ、C++ の Mac で動作するものが必要ですが、長期的には BLAS に基づいている必要があるため、プラットフォーム間で動作します。