ARM NEONのドキュメントでは、次のように述べています。
[...] 一部の命令ペアは、値がレジスタ ファイルに書き戻されるまで待機する必要がある場合があります。
転送された結果を使用できる命令ペアと、ライトバックを待機する必要がある命令ペアを定義するリストに出くわしませんでした。
これらのペアをリストした表またはドキュメントを知っている人はいますか?
これらのペアをリストした表またはドキュメントを知っている人はいますか?
これらのペアは9000を超えており、すべてをリストすることはできません。
例えば:
VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2
最初の命令は 4 番目のサイクルで結果を書き戻しますが、2 番目の命令は 2 番目のサイクルでソースとしてそれ (q0) を必要とするため、ソースはまだ準備ができていないため、この 2 つの命令の間にストール (またはパイプラインの「穴」) があります。 .
この失速を計算するには、次のオンライン ツールを使用できます:
http://pulsar.webshaker.net/ccc/result.php?lng=us
整数乗算累積。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/ch16s06s03.htmlの最後のセクションが役立ちます。
積和が積和または別の積和に続き、その最初の命令の結果に依存する場合、両方の命令間の依存関係が同じタイプとサイズである場合、プロセッサは特別な乗数アキュムレータ転送を使用します。この特別な転送は、N5 の最初の命令の結果が N4 の 2 番目の命令のアキュムレータに転送されるため、乗算命令が連続して発行できることを意味します。命令のサイズとタイプが一致しない場合、N3 で Dd または Qd が必要になります。これは、積和命令 VMLA、VMLS、VQDMLA、および VQDMLS と、乗算命令 VMUL および VQDMUL の組み合わせに適用されます。
浮動小数点の乗算累積が同じように機能するとは思わないでください。パフォーマンスが重要な場合に浮動小数点 NEON 命令を使用したことがないため、ここで経験を提供することはできませんが、http://infocenter.arm.com/help/index の最後にある注を読んで理解してください。 jsp?topic=/com.arm.doc.ddi0344k/BCGDCECC.html
大まかに言えば、転送することを合理的に期待するものは、転送します。vmul.f32 は vadd.f32 などに転送されます。
正確な転送パスが、探している方法で正確に文書化されているとは思いません。とにかく、私はそれらを見つけていません。見つけた場合は、必ず場所をお知らせください。もちろん、指定された命令のペアについて転送が発生するかどうかを判断するのはそれほど難しくありませんが、それは一般的な解決策ではありません。ごめん。