質問

新しい ARM プロセッサには、PLD 命令と PLI 命令が含まれています。

私は非シーケンシャルなメモリ アクセス パターンを持つタイトな内部ループ (C++ で) を作成していますが、このパターンはコードが自然に完全に理解するものです。現在のメモリ位置を処理しながら次の位置をプリフェッチできれば、大幅な高速化が期待できます。これは実験する価値があるほど高速であると予想されます。

私は ARM の新しい高価なコンパイラを使用していますが、私が気にしているこの特定のループにはもちろん、どこにも PLD 命令が含まれていないようです。

C++ コードに明示的なプリフェッチ命令を含めるにはどうすればよいですか?

役に立ちましたか?

解決

コンパイラ固有の機能がいくつかあるはずです。C/C++ ではこれを行う標準的な方法はありません。コンパイラのコンパイラ リファレンス ガイドを確認してください。RealView コンパイラについては、を参照してください。 これ または これ.

他のヒント

これらのループから真に最大のパフォーマンスを引き出そうとしている場合は、ループ構造全体をアセンブラーで記述することをお勧めします。ループに含まれるデータ構造に応じて、インライン アセンブリを使用できるはずです。ループの任意の部分 (アクセスを非順次にすることに関係する部分など) を展開できればさらに良いでしょう。

当然のことを尋ねる危険を冒してください:コンパイラのターゲット アーキテクチャを確認しましたか?たとえば (冗談ですが)、デフォルトでコンパイラが ARM7 をターゲットにしている場合、 一度もない PLD命令を見に行きます。

次のような他の最適化も可能性の範囲外ではありません。 ソフトウェアパイプライン そして ループ展開 プリフェッチのアイデアと同じ効果 (有用な計算とオーバーラップすることでロードのレイテンシーを隠す) を達成できる可能性がありますが、追加の命令によって引き起こされる追加の命令キャッシュ圧力は発生しません。命令も制御フローもほとんどない傾向にあるタイトな内部ループでは、これが頻繁に起こるとさえ言えます。コンパイラは、代わりにこのようなタイプの従来の最適化を実行していますか。その場合は、パイプライン図を見て、プロセッサがどのように動作するかについてのより詳細なコスト モデルを作成し、プリフェッチが役立つかどうかをより定量的に評価する価値があるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top