2010-12-05 9 views
0

は、私が次のARM命令セットはストールを生成しますか? ARM11MP VFPUプログラミング


    fmuls s0, s0, s4 
    fmacs s0, s1, s5 
    fmacs s0, s2, s6 
    fmacs s0, s3, s7 

はaccumuate行いませドキュメント上で見て、(4×4行列乗算の一部として)4成分内積を行う際には、以下がひどくストールすることを懸念していましたステップはここでストールを生成する?そうであれば、私は実際には32個の単一レジスタだけを使用して作業をし、その後は9個を取るので、本当に物事を変える必要があります。また、1命令でこれを行うようにベクトルレジスタを設定することもできましたが、ARMレジスタにあふれない限り、メモリへのストア直後にストアを直ちに解除する必要があるため、3命令サイクルが有効かどうか疑問に思っています。ここの私の実際のSOアカウントを持たない家からの投稿...

+1

's1'と' s5'の乗算は 's0'への前回の追加が完了するまで開始できないという懸念はありますか? – Gabe

+0

s0が累積されたs2、s6が正しいか、または –

答えて

1

私はARMをよく知らないので、これを塩の塊で取るべきです。この回答はちょうど私の携帯電話のドキュメントの周りを検索の約20分に基づいています。私は行方不明のものがあるかもしれないので、これは正しいとは限りません。

いずれにしても、私はそう信じています。これはパイプラインのストールを引き起こすはずです。 VFPコプロセッサには8段のパイプラインがありますが、 "転送"(各命令は前の命令の結果に依存します)のため、命令ごとにストールサイクルの数を7に減らす必要があります。それでも、4つの指示を与えれば、あなたは約28サイクルの間停止するでしょう。これはあまり良くありません。これはまた、レジスタをロードするのに必要な時間を考慮しないため、問題を悪化させる可能性があります。

「fld命令」をfmacsの命令とインタリーブすることで、パフォーマンスが向上する可能性があります。

チェックアウトの詳細情報については、以下:

fld s0 
fld s4 
fld s1 
fld s5 
fmuls s0, s0, s4 
fld s2 
fld s6 
fld s3 
fld s7 
fmacs s0, s1, s5 
famcs s0, s2, s6 
fmacs s0, s3, s7 
:あなたのような何かをすることができれば意味4サイクル以内に利用可能であるべき「FLD」命令、の

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACBBDCE.html

結果

次に、ストールしたサイクルの総数を17に減らすことができます。

これをループで実行していると仮定すると、おそらく、現在の反復が実行されている間に「次の」ループ反復について作業を開始しようと試みることによりストールをさらに減少させる(すなわち、ループアンローリング)。また、データがどのように格納されているかに応じて、ループアンロールを実行すると、fld命令の代わりにfldmを使用することで、おそらくもっと改善することができます。

いずれにしても、パイプライン動作を手動で最適化することは困難です。コンパイラに命令スケジューリングをさせることができない理由はありますか?

+0

です。私が気付いているARMコンパイラは、この機能に悪影響を及ぼしています。私はこのことをもっと深く見ていきますが、mla/fmacがそうするように設計されていて、それを止めているのは、まさにこのようなものです。私は乗算から足し算を外し、積算のために別のレジスタを使用することを検討します。いくつかの世話をすると、おそらくそれをさらに減らすことができます。これをベクトル化することについても調査する必要があります。これは、ARMコンパイラでもこれを試みないためです。 –

関連する問題