2011-09-14 12 views
7

インテルは有用にプリフェッチプラグマを提供します。コンパイラによって決定されるように、例えばオブジェクト内にデータが隠されている場合にintel prefetchプラグマを使用するには?

#pragma prefetch a 
for(i=0; i<m; i++) 
    a[i]=b[i]+1; 

は、前方ループサイクルのa一定数をプリフェッチします。

しかし、aが配列ではなく、[]のクラスがオーバーライドされている場合はどうなりますか? operator[]が単純な配列アクセスを行う場合、プリフェッチはこのように使用できますか?

(おそらく質問はstd::vectorsにも当てはまります)。

答えて

2

調べる方法の1つは、アセンブリを試してみることです。それ以外のものは、プラグマの有無にかかわらずベンチマークしてください。しかし、プリフェッチプラグマがあなたの望むものであるかどうかはわかりません。

プリフェッチプラグマはインテル®Itanium®プロセッサでのみサポートされています。

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/cref_cls/common/cppref_pragma_prefetch_noprefetch.htm

あなたは本当にItaniumのためにこれを書いていますか?

x86/x64システムでは、シーケンシャルメモリアクセスのような単純なループは、すでにハードウェアプリフェッチャによってうまく処理されています。したがって、マニュアルプリフェッチを行うことはまったく役に立ちません。

は、プリフェッチ例は、ここを参照してください:Prefetching Examples?

+0

私は、x86とItaniumの両方のためにコンパイルしている - とパフォーマンスを心配し、誰もが(グリッド上)、後者を使用すると仮定します。ハードウェアプリフェッチャーが何をしているのかを指摘してくれてありがとう。私は気づいていなかった。 –

+0

2018年、このプラグマは、インテル®MICアーキテクチャーおよびインテル®アドバンスト・ベクトル・エクステンション512(インテル®AVX-512)にのみ適用されます。 – Olsonist

+0

プリフェッチは一般的にはx86では機能しますが、プリフェッチプラグマでは機能しません。代わりに、-qopt-prefetchフラグを使用します。 – Olsonist

関連する問題