この記事は、インテル® ソフトウェア・ネットワークに掲載されている「User Manual for the Rdrand Library (Windows* Version) 」(http://software.intel.com/en-us/articles/user-manual-for-the-rdrand-library-windows-version/) および「User Manual for the Rdrand Library (Linux* Version)」(http://software.intel.com/en-us/articles/user-manual-for-the-rdrand-library-linux-version/) の日本語参考訳です。
ソースのダウンロード
Rdrand ライブラリー (Windows* 版): http://software.intel.com/file/43730
Rdrand ライブラリー (Linux* 版): http://software.intel.com/file/43729
概要
Rdrand ライブラリーは、これまで rdrand 命令を利用できなかったユーザーに rdrand 命令を提供します。
第 3 世代インテル® Core™ プロセッサー (コード名: Ivy Bridge) で追加された新しい “rdrand” 命令は、誰でもすべての権限レベルで利用できます。ただし、残念ながら、まだ新しい技術であるため、開発ツールでのサポートは限定的です。このライブラリーは、あらかじめコンパイルされたスタティック・ライブラリーを利用して、簡単にこの機能を使用することを目的としています。ランダムなデータを扱うさまざまなサイズの “rdrand” 命令を使用する、一貫性のある小さく使いやすい API を提供します。また、必要に応じて変更できるように、ライブラリー全体のソースコードとビルドシステムも提供されています。
新しい rdrand 命令の制限事項の 1 つは、呼び出し元に結果が返される保証がないことです (結果の代わりに、ハードウェアの準備ができていないことが知らされる場合があります)。API を簡略化するため、ループ (デフォルトでは 10 回反復し、ユーザーによる制御は不可だが、ソースで変更可能) を要求して、ハードウェアの準備完了を待機するか、失敗することで透過的にこれに対処できます。
はじめに
このライブラリーは Microsoft* Windows*、Microsoft* Visual Studio* 2010、および Linux* Ubuntu* 10.04 用のスタティック・ライブラリーとともに配布されます。このライブラリーもソースからビルドすることができます。ビルドには、インテル® C++ コンパイラー 12 以降が必要です。詳細は、「ビルド」セクションを参照してください。
スタティック・ライブラリーをビルドしたら、ライブラリーをコードにリンクし、ヘッダーファイルの検索パスにヘッダーを追加するだけです。スタティック・ライブラリーのリンクについては本題から外れるため詳しく取り上げませんが、参考までに Windows* 用の test という名前の Microsoft* Visual Studio* プロジェクトと、Linux* 用の簡単なプロジェクトおよび Makefile を用意しています。test のソースは main.c にあります。Linux* 用のプロジェクトでは (ターゲット 32_test または test で) トップレベルの Makefile を使用できます。rdrand.sln ソリューションには test プロジェクトが含まれています。
rdrand は新しい命令なので、第 3 世代インテル® Core™ プロセッサー (コード名: Ivy Bridge) のマイクロアーキテクチャー以降でのみサポートされています。そのため、プロセッサーでこの新しい命令がサポートされているかどうかを確認します。これは、cpuid を呼び出し、ecx レジスターのビット 40 を確認することで分かります。ライブラリーは自動でこの確認を行い、その結果を内部的に保存することで、エンドユーザーには透過的に処理します。この結果はグローバルデータとして保存され、1 つの実行スレッドが rdrand をサポートしていれば、すべてのスレッドが rdrand をサポートする場合にスレッドセーフです。
API はできるだけ簡略化され、使いやすく設計されており、次の 3 つの関数のみで構成されています。
int rdrand_16(uint16_t* x, int retry);
int rdrand_32(uint32_t* x, int retry);
int rdrand_64(uint64_t* x, int retry);
各関数は内部で rdrand を呼び出し、特定のデータサイズのランダムなデータを呼び出し元に返します。さらに、各関数の int 型の第 2 引数 retry は、ハードウェアの準備ができていない場合に関数呼び出しを指定された回数だけ (デフォルトは 10 回) 再試行するかどうか (true または false) を指定します。この関数の戻り値は、ハードウェアの準備ができていないこと (再試行しないように指定した場合)、成功したこと、あるいはホスト・ハードウェアが “rdrand” をサポートしていないことを示します。これらの定義の詳細は、定義のドキュメントを参照してください。
データ型が厳密に指定されていますが、これらのデータ型は新しい C99 ヘッダー stdint.h で定義されています。これはライブラリーの広範な使用目的に反します。そのため、コンパイラーの C99 サポートが検出されない場合は rdrand.h で定義されるデータ型が使用されます。Microsoft* Visual Studio* のサポートのみ提供されますが、インテル® C++ コンパイラーと GCC* 4.4.3 はともにネイティブでこれらの C99 データ型をサポートしています。
ビルド
Rdrand ライブラリーのビルドは、Microsoft* Visual Studio 2010* (Windows* の場合) とインテル® C++ コンパイラー 12 (Linux* の場合) でサポートされています。これは、ライブラリーがインテル® C++ コンパイラー 12 の組込み関数を使用して記述されているためです。
ライブラリーをビルドするには、Microsoft* Visual Studio* ソリューション、rdrand (rdrand.sln) を開き、インテル(R) C++ コンパイラーを使用するように選択されていることを確認して、[ビルド] メニューから通常通りにプロジェクトをビルドします。デモプログラムには、実際のライブラリー rdrand と test の 2 つのプロジェクトが含まれています。
Linux* の Makefile にはスタティック・ライブラリーをビルドするコマンドが含まれていますが、ホスト CC (GCC 4.4.3 でテスト済み) を使用して生成されたライブラリーにリンクし、実行ファイルを生成することもできます。ターゲット 32 および 64 は、それぞれ 32 ビットおよび 64 ビットのスタティック・ライブラリーをビルドします。ターゲットのクリーンと、32 ビットおよび 64 ビットのデモプログラムをビルドする 32_test と test も用意されています。
リリースノート
Rdrand ライブラリーは簡単に使用でき、このリリース時点で完全な機能を備えています。既知の問題はありません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。