2016-06-18 10 views
0

私の関数では、独立した要素の賢明な行列乗算がたくさんあります。それらを並行して計算する方法はありますか?高速化のための行列乗算の並行シーケンス

これらはすべて非常に単純な操作ですが、実行時間の70%はこれらの部分のコードです。この機能は何百万回も呼び出されるためです。

function [r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3) 
r1=A.*B; 
r2=C.*D; 
r3=E*F; 
end 

for i=1:300 

[r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3) 

end 

答えて

0

EDIT:答えを書いた後、私はあなたが行列乗算によってすべての入力行列を乗算していないことを観察しました。それらのいくつかは要素ごとの乗算です。これがあなたが意図したものであれば、以下の答えは適用されません。

複数の行列積を計算するための最適なアルゴリズムを探しています。人々はずっと前にこの問題を研究しており、最適な順序を決定する動的プログラミングアルゴリズムを思いついた。例えば

Aサイズ1 x 10000Cのですが、サイズ10000 x 1のあるサイズ10000 x 1Bのであれば、我々はA*(B*C)としてA*B*Cを計算した場合、それは代わりに(A*B)*Cの、多くの方が効率的でしょう。この技法の正確さの証明は、行列乗算が連想的であるという事実にある。これについての詳細はon Wikipediaです。 良質なMATLABの実装を希望される場合は、hereとなります。マトリクスを入力として取り出し、製品を出します。この実装が "最大10個の行列"を計算する最適な方法を見つけるうえでまともな仕事をしているようです。

+0

あなたの答えは、はい、それらのほとんどは要素の賢明な操作です。シーケンシャルではなく、すべてを並行して実行する方法はありますか? –

+0

次に、 'r1、r2、r3'の役割を明確にします。入力として渡しますが、まったく使用しません。それらは出力として与えられます。だから、あなたもそれらを渡すことはできませんが、私は正しいですか? –

+0

@ Parag S. Chandakkar:申し訳ありませんが、私はあなたの意味を理解していません。もっと説明してください。次のitterateで、前のitterateから来るそれらの現在の値が重要であるので、私はr1、r2、r3をouptupで送ります。 –

0

最初に注意してください:あなたが入力として提供した最後の3つの変数は、使用されていません。私はこれが大したことではないと思うが、それをきれいにするほうが良いだろう。

今、実際の答え:

MATLABは、すべての行列演算についてですが、これは、高度に最適化されています。 C++を使用しても、大幅なスピードアップは期待できません(また、スピード低下には注意してください)。したがって、質問に提供される情報では、独立した行列計算を高速化するために何もできないという結論が出ます。

言われているように:順次関数呼び出しの数を減らすことができれば、何かが得られるかもしれません。

一般的にこれを行う方法とは言い難いが、二つのアイデア:

  1. あなたは並列処理ツールボックスを持っていると仮定すると(代わりにparforループを使用し、forループ内でのfuctionを呼び出す場合、そうでなければ、手作業でループを分割し、4つのmatlabインスタンスを開いてループをパラレル化します(必要に応じてautomatedにすることができます)。
  2. 小行列演算にこのように多くの関数呼び出しが本当に必要かどうかを確認してください。巨大な改善ですが、そうでなければ複数の行列を組み合わせることができます(Aの複数のバージョン例えばBの複数のバージョン)、100の小さなものではなく、1つの大きな乗算を行います)。
+0

ありがとうございます、私はforループでこの関数を呼び出しますが、呼び出し順序は重要ですが、行列oprtationsの順序は重要ではないため、parforは使用できません。 –

+0

@ A.Mani実際にはそれほど多くはありません。ポイント2で述べたように、あなたがしようとしていることと、実行しているすべての計算が本当に必要かどうかを考え、それらはすべて順番にする必要があります。答えが「はい」の場合は、(現在のハードウェアの)ランタイムを受け入れなければならないと思います。 –