2016-05-12 9 views
4

BLAS(基本線形代数サブプログラム)はMatlabのような他の多くのプログラミング言語を提供していますが、行列乗算などの高速ルーチンがあります。BLASは行列連鎖最適化を組み込んでいます

ただし、複数の行列を掛け合わせると、行列を「かっこ」する最適な順序があります。 wikipedia articleから採取された:例えば

、Aは、10×30行列であるとし、Bは、30×5の行列であり、 Cは、5×60行列です。次いで、

(AB)C =(10×30×5)+(10×5×60)= 1500 + 3000 = 4500の動作

A(BC)=(30×5×60)+ (10×30×60)= 9000 + 18000 = 27000回の操作である。

この記事では、この乗算の最適な順序を解く方法について説明します。私の質問は、これらの最適化手順のどれかがBLASで利用されているということですか?そうでなければ、ブラケットを適切に使用してMatlabのようなプログラムで行列乗算の順序を明示的に定義すれば、より良い速度を得ることができますか?

答えて

2

BLASの標準的な定義はhereであり、複数の行列を含む呼び出しは含まれません。だから私は、その定義に続く実装はあなたが言及する連鎖最適化を提供するとは思わない。 BLASは過去30年間に死に至ったので、そこにはmany implementationsがあり、知っている人もいます。若干の退屈な博士課程学生が、ある時点でそれをやろうと決めたかもしれません:)

つまり、similar but not compatible with BLASのようなEigenのような実装では、エクスプレッションテンプレート(...)のような機能を使用して、一時的に削除して遅延評価を有効にすることができます。これは有望なことですが、マトリックスチェインに適用するかどうかはわかりません。私はそれが彼らのbenchmarkに含まれていないという事実によって判断していないと思う。

結論は、最も信頼できる方法を見つけることは、ちょうどあなた自身を試してください。あなたの言語/実装の選択は非常に簡単に確認できます。質問の例を試してください。すべての次元の時間100。

関連する問題