効率的な行列-ベクトル乗算のための行列のパターンの活用


8

私は次のような状況にあります。一連のベクトルあり、それぞれ、が最初に固定されている積を計算します。の構造に関する情報はありませんが、には通常、多くの値が繰り返される特定のパターンがあり、これらの積をできるだけ高速に計算したいと考えています。x1,x2,..AxiAxiA

1つの例は次のようになります。A

ここに画像の説明を入力してください

ここで白い領域は0です。

に関する情報を格納する方法、または何らかの方法でそれを変更して、各製品の操作の数を減らすことができる方法があるのでしょうか。すべて0の行の場合、これは簡単です。そのような行を示す行インデックスを格納するだけです。行の計算を再利用するために、複製された行に関する情報を保存することもできます。また、各行の平均差を最小化し、各行の差だけを計算するなど、行列の行の順序付けも検討しました。しかし、これはより複雑なパターンの問題にぶつかるようです。A

この種の問題に対する既知の方法があるのか​​と思っていました。

編集:私が持っていたもう一つのアイデアは、それ以来ないということです。マトリックス内の一意の値の数はかなり少ないため、として製品を分解できます。ここで、は一意の値が1つしか含まれていませんが、これがこの問題に何らかの利点をもたらすかどうかはまだません。Ax=A1x+A2x+AnxA


2
多くの行で同一の列のブロックがいくつか表示されます(たとえば、多くの行ですべて黄色の列のブロック)。特定のベクトルについて、そのブロックのx iの要素の合計を計算する場合、それを使用してそれらの行の処理を高速化できます。バツバツ
DW

存在する場合マトリックスの行の個別の値、およびdははるかに少ない(多くの場合、ここでケースのように見える)行の要素の総数よりも、あなただけの使用に必要Dのドット積を計算する乗算乗算は加算に分散するため、その行のxベクトルとの関係:たとえば、a x i 1 + b x i 2 + b x i 3 + a x i 4 + a x i 5 = a x i 1dddバツaバツ1+bバツ2+bバツ+aバツ4+aバツ5=aバツ1+バツ4+バツ5+bバツ2+バツ
j_random_hacker 2018年

1
1)行列をブロックに分割することにより、ブロックにすべての行が同じである場合、ブロックを特定のベクトルで一度乗算し、ブロックのすべての行でその部分的なドット積を再利用できます。2)ブロックの列がすべて同じ場合、DWによる最適化が機能します。3)一連のベクトルをバッチ処理できる場合は、GPUで行列乗算を実行できます。4)分解する場合それぞれを定数のバイナリマトリックスとして書き込むことができ、バイナリマトリックスによる乗算は加算を必要とするだけなので、個別の値ごとに1つの乗算のみが必要です。12

1
アイデアを得るために、今ブラスを使用していますか?
マウロヴァンゼット2018年

1
そして今、あなたはどのように製品を作りますか?私は実際的な配慮をすることを試みます。Blasを他のライブラリを介して直接的または間接的に使用すると、ハードウェア(カスタムマトリックスベクトル積では入手が非常に困難なもの)に近い最適なモードで使用できます。だから、多分ブラスを使用して、あなたは、限られた労力で大きなスピードアップをアーカイブすることができます。
マウロヴァンゼット2018年

回答:


3

別の見方をお勧めします。たぶんいくつかの巧妙な行列乗算でパフォーマンスの改善を得ることができるかもしれませんが、努力を尊重して小さな結果を得る可能性は複数あります。

この種のマトリックスは小さく、について話しています。Modercpusは非常に強力で、このサイズで問題なく動作します。ボトルネックは、データをCPUに移動することです。この種の問題は、Blasライブラリで対処されています。Blasライブラリは、乗算だけでなく、ハードウェア内を移動するデータを最適化する方法も処理します。138×78

私たちにとって不可能に近いことを明確にすることは非常に難しく、ブラス関数を尊重して最高のパフォーマンスを得るようにしてください。古典的な例は、ネストされたループです。たとえば、Atlasをインストールすると、Blasの特定の実装により、ハードウェアの自動チューニングが行われます(このPDFを参照)。

これらの理由から、私があなたに伝える最初の提案は、Blasライブラリを使用することです。リストについては、前のwikiページを参照してください。コマーシャルまたはフリーがありますが、ここはあなた次第です(おそらくOpenBlasから始めることができます)。その下にブラスを使用するライブラリもあり、より快適であることに注意してください。

これで十分でない場合は、他の方法で試してください。ただし、乗算にはBlasを使用してください。

ゼロ要素の数がますます増えている場合は、ケースは異なりますが、これはケースではなく、約90%です。ここにはスパースマトリックスがあり、さまざまな格納方法を使用して利点を得ることができます。この場合にも、スパースBlasが見つかることに注意してください。


特に何を最初に試すかに関して、私はこの答えに完全に同意します。高度に最適化された線形代数ライブラリを使用して、密な行列-ベクトル積から始めるのは良いことであり、後でそれに対して思いついた巧妙な手法をベンチマークすることができます。必要に応じて。
アントンメンショフ

0

免責事項:計算のオーバーヘッドがかなり増えるため、これが実際に計算を高速化するかどうかはわかりません。マトリックスがまばらではないように見えるため、インテルMKLのようなBLAS実装を打ち負かすことを想像するのは困難です。


そうは言っても、ここにアイデアがあります:

Jバツ

マトリックスに重複のない値がある場合は、それらをすべて1つの従来のスパースマトリックスに入れて、MVPを「通常の」スパースマトリックスの方法で実行できます。

バツ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.