私は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を使用することで、おそらくもっと改善することができます。
いずれにしても、パイプライン動作を手動で最適化することは困難です。コンパイラに命令スケジューリングをさせることができない理由はありますか?
's1'と' s5'の乗算は 's0'への前回の追加が完了するまで開始できないという懸念はありますか? – Gabe
s0が累積されたs2、s6が正しいか、または –