2009-09-04 14 views
3

私は、SSEプリフェッチ命令のインラインアセンブリを含むコードを扱っています。プリプロセッサ定数は、32,64、または128ビットのプリフェッチの命令を使用するかどうかを決定します。このアプリケーションは多種多様なプラットフォームで使用されていますが、今のところ私はそれぞれのCPUで最適なオプションを調べなければなりませんでした。私はこれがキャッシュラインサイズであることを理解しています。この情報は自動的に得られますか?/proc/cpuinfoには明示的に存在していないようです。SSEプリフェッチ命令サイズを決定する方法は?

答えて

3

あなたの質問は、このquestionまたはthisと関連していると思います。私は、あなたがOSやライブラリ関数に頼ることができない限り、CPUID命令を使いたいと思うが、質問があなたが探している情報に正確になることは明らかだと思う。もちろん、AMDとIntelの実装は合意する必要はありません。このpageは、Cpuid.1.EBX [15:8](すなわち、BH)を使用してIntelで検索し、80000005hをAMDで使用することを提案しています。また、インテルでは、CPUID.2に関連情報が含まれているようですが、必要な情報を解析するのは本当の苦痛のようです。

私が思うに、私が読んだから、AMDとIntelのCPUID命令の両方がCPUID.1.EBX [15:8]をサポートします、CLFLUSHで使用されるようにクワッドワードに1つのキャッシュラインのサイズを返します。命令(すべてのプロセッサには存在しないため、常にそこに何かがあるかどうかはわかりません)。 したがって、CPUID.1を実行した後、BHに8を掛けて、キャッシュラインサイズをバイト単位で取得する必要があります。これは、CLFLUSHとPREFETCHh命令では、1つのキャッシュラインサイズの定義が常に同じであるという私の暗黙の前提に基づいています(本当に有効かどうかは誰にでも分かりますか?

はまた、IntelのmanualsはPREFETCHhは単なるヒントであると述べているが、それが何かをプリフェッチ場合には、それは常に32バイトの最小になります。

EDIT1: PREFETCHhの最適化された使用についてのもう1つの有用なリソース(質問に直接答えない場合でも)は、Intelの最適化マニュアルhereです。

関連する問題