SSE プリフェッチ命令のインライン アセンブリを含むコードを使用しています。プリプロセッサ定数は、32 バイト、64 バイト、または 128 バイトのプリフェッチの命令が使用されるかどうかを決定します。このアプリケーションはさまざまなプラットフォームで使用されており、これまでのところ、特定の CPU に最適なオプションをそれぞれのケースで調査する必要がありました。これがキャッシュ ライン サイズであることは理解しています。この情報は自動的に取得されますか? /proc/cpuinfo に明示的に存在していないようです。
1 に答える
あなたの質問はこの質問またはこれに関連していると思います。OSやライブラリ関数に頼ることができない限り、CPUID命令を使用したいと思うことは明らかだと思いますが、問題はまさにあなたが探している情報になります。-そしてもちろん、AMDとIntelの実装は同意する必要はありません。このページでは、Intelで調べるためにCpuid.1.EBX [15:8](つまり、BH)を使用し、AMDで80000005hを機能させることを提案しています。さらに、Intelでは、CPUID.2 ...に関連情報が含まれているように見えますが、必要な情報を解析するのは非常に苦痛のようです。
私が読んだことから、AMDとIntelの両方のCPUID命令はCPUID.1.EBX [15:8]をサポートすると思います。これは、CLFLUSH命令で使用されるQUADWORDの1つのキャッシュラインのサイズを返します(これはそうではありません)すべてのプロセッサに存在するので、常に何かが見つかるかどうかはわかりません)。したがって、CPUID.1を実行した後、キャッシュラインサイズをバイト単位で取得するには、BHに8を掛ける必要があります。これは、1つのキャッシュラインサイズの定義がCLFLUSH命令とPREFETCHh命令で常に同じであるという私の暗黙の仮定(それが本当に有効かどうかを誰かが言うことができますか?)に依存します。
また、Intelのマニュアルには、PREFETCHhは単なるヒントであると記載されていますが、何かをプリフェッチする場合は、常に32バイト以上になります。
編集1:PREFETCHhの最適化された使用のためのもう1つの有用なリソース(あなたの質問に直接答えていなくても)は、ここにあるインテルの最適化マニュアルです。