インテル® IPP を使用してインテル製マルチコア・プロセッサーの詳細情報を取得する

インテル® IPP

この記事は、Dr.Dobb’s Go Parallel に掲載されている「Retrieving Detailed Information About Your Intel Multicore CPU Features with Intel IPP」 (http://drdobbs.com/go-parallel/blogs/tools/232300050) の日本語参考訳です。


ハードウェアを最大限に活用する最適化コードを記述するには、以下のようなことを知らなければいけません。

  • プロセッサーで Nehalem✝ や Sandy Bridge✝ マイクロアーキテクチャーが採用されているか?
  • プロセッサーがインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) に対応しているか?
  • プロセッサーがインテル® ストリーミング SIMD 拡張命令 4.2 (インテル® SSE 4.2) に対応しているか?

インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) の関数を呼び出すことで、これらの情報を取得できます。

インテル製マルチコア・プロセッサーの詳細情報を取得する方法はほかにもありますが、たいていの場合はインテル® IPP の 2 つの関数 (ippGetCpuTypeippGetCpuFeatures) を呼び出すことで、どのプログラミング言語でも必要なプロセッサーの詳細情報が得られます。例えば、インテル® IPP には C# ラッパーが含まれているので、C# から ippGetCpuType を呼び出すのは非常に簡単です。

ippGetCpuTypeippGetCpuFeatures の両関数を使用する利点は、これらの関数は常に最新のインテル® マイクロアーキテクチャーと SIMD 命令セット向けに更新されることです。新しいバージョンのインテル® IPP がリリースされると、通常これらの関数は、その時点で最新のインテルのプロセッサー機能を識別する新しい値を返すことができます。そのため、特定のプロセッサー機能を識別するハードウェア・レベルの呼び出しについて心配する必要はありません。常に、新しい機能を最大限に活用する最適化コードの作成に専念できます。

ippcore.h で宣言されている ippGetCpuType 関数は、検出したプロセッサーに応じて適切な IppCpuType 値を返します。この関数は、1 種類のプロセッサーだけを返し、すべての機能を返すわけではありません。例えば、インテル® AVX 対応プロセッサーを搭載したコンピューターやデバイスの場合、IppCpuType.ippCpuAVX を返します。しかし、インテル® AVX 対応プロセッサーは、インテル® SSE 4.2、インテル® SSE 4.1、その他の SIMD 命令セットにも対応しています。インテル® SSE 4.2 に対応する前世代のモバイル向けインテル® Core i7 プロセッサー (Clarksfield✝) を搭載したコンピューターやデバイスの場合、ippGetCpuTypeIppCpuType.ippCpuSSE42 を返します。

プロセッサー機能に関するより詳細な情報が必要な場合、通常 x86 ファミリーでは CPUID 命令の使用を思いつくでしょう。これについては、「インテル® プロセッサーの識別と CPUID 命令」(http://download.intel.com/jp/developer/jpdoc/Processor_Identification_071405_i.pdf) に詳細な説明があります。しかし、アプリケーションを必要以上に複雑にしたり、アセンブリーコードを追加しなくても、ippGetCpuFeatures 関数を使用して、CPUID 命令によって返される主なプロセッサー機能の情報をより簡単に取得するほうが実用的です。ippGetCpuFeatures を呼び出すだけで、機能マスクに対してビット単位で演算子を適用し、プロセッサーにより提供される特定の機能を検出できるため、プロセッサーがインテル® SSE 4.1、SSE 4.2、AES、AVX などの複数の命令セットに対応しているか、または個々の命令セットに対応しているかを判断することができます。

さらに、オペレーティング・システムがインテル® AVX をサポートしているかを検出することもできます。ippCUPID_AVX (256) マスクの値は、プロセッサー・レベルでのインテル® AVX のサポート状況を示し、ippAVX_ENABLEDBYOS (512) マスクの値はオペレーティング・システムのインテル® AVX のサポート状況を示します。返された機能マスクに ippCUPID_AVX は含まれているものの、ippAVX_ENABLEDBYOS は含まれていない場合、プロセッサーはインテル® AVX に対応していても、オペレーティング・システムは対応していないため、インテル® AVX を利用することはできません。オペレーティング・システムのインテル® AVX サポートについては、「Windows 7 and Windows Server 2008 R2 Service Pack 1 Bring AVX Support」 (http://drdobbs.com/blogs/high-performance-computing/229300330) を参照してください。

インテル® IPP は商用製品ですが、こちらから無料体験版をダウンロードすることができます。

ippGetCpuType と ippGetCpuFeatures の両関数について詳しく知りたい場合は、これらの関数に関連する列挙値、マスク、引数、および戻り値についての詳細なドキュメントが参考になるでしょう。

✝開発コード名

タイトルとURLをコピーしました