こんな感じで使っています。
__pld(pin[0], pin[1], pin[2], pin[3], pin[4]);
しかし、私はこのエラーが発生します。
undefined reference to `__pld'
私は何が欠けていますか?ヘッダーファイルなどを含める必要がありますか? ARM Cortex A8 を使用していますが、pld命令もサポートしていますか?
この回答に示されているように、 Clarkに従ってインライン アセンブラを使用できます。 __builtin_prefetch
も良い案です。知っておくべき重要な事実は、pld
命令が ARM でどのように動作するかです。一部のプロセッサでは何もしません。それ以外の場合は、データをキャッシュに取り込みます。これは、読み取り操作 (または読み取り/変更/書き込み)に対してのみ有効です。注意すべきもう 1 つのことは、プロセッサで動作する場合、キャッシュ ライン全体をフェッチすることです。したがって、配列をフェッチする例では、pin
すべてのメンバーを指定する必要はありません。
データが確実にpld
キャッシュに配置されるようにすることで、パフォーマンスが向上します。別の問題として、前のコードを見ると、読み取り変数でのみパフォーマンスが向上します。場合によっては、ピン配列に書き込むだけです。これらのアイテムをプリフェッチしても意味がありません。ARM には書き込みバッファがあるため、書き込みはまとめてバッチ処理され、SDRAM チップに自動的にバーストします。
すべての読み取りデータを 1 つのキャッシュ ラインでグループ化すると、パフォーマンスが最も向上します。行全体を 1 つの で事前にフェクトできますpld
。また、ループをアンロールすると、コンパイラーはこれらの読み取りを確認できるようになり、可能な場合はそれらがキャッシュに書き込まれるように早期にスケジュールされます。少なくとも一部の ARM CPU では。
また、次のように考えることができます。
__attribute__((optimize("prefetch-loop-arrays")))
他の質問に対する受け入れられた回答の精神で; -O3
指定した CPU で有効な場合、おそらくコンパイラはこれを既に有効にしているでしょう。
さまざまなコンパイラ オプションを指定し--param NAME=VALUE
て、メモリ サブシステムのコンパイラにヒントを与えることができます。パラメータを正しく設定すれば、これは非常に強力な組み合わせになる可能性があります。
prefetch-latency
simultaneous-prefetches
l1-cache-line-size
l1-cache-size
l2-cache-size
min-insn-to-prefetch-ratio
prefetch-min-insn-to-mem-ratio
-mcpu
をサポートするコンパイラに必ず を指定してくださいpld
。すべてが正しければ、コンパイラはこれを自動的に行うはずです。ただし、手動で行う必要がある場合もあります。
参考までに、gcc-4.7.3 のARM prefetch loop arrays
コードのアクティベーションを次に示します。
/* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed
it beneficial (signified by setting num_prefetch_slots to 1 or more.) */
if (flag_prefetch_loop_arrays < 0
&& HAVE_prefetch
&& optimize >= 3
&& current_tune->num_prefetch_slots > 0)
flag_prefetch_loop_arrays = 1;