第三世代Coreプロセッサー・ファミリーのハードウェア乱数発生器を利用する | インテル ツール フォーラム | フォーラム

iSUS に投稿されている記事の内容や、IA プラットフォーム上でのソフトウェア開発に関するトピックを開発者同士でディスカッションできる場としてフォーラムを公開しています。

運営ルールはフォーラムの利用案内をご覧ください。
フォーラムの使い方はこちら

 
フォーラムに投稿するにはログインが必要ですログイン

第三世代Coreプロセッサー・ファミリーのハードウェア乱数発生器を利用する

メンバー投稿

5:44 AM
2012年6月26日


iSUS編集部 – 菅原

投稿数 206

1

投稿は 5:46 AM – 2012年6月26日 に iSUS編集部 – 菅原 さんにより更新されました


第三世代Coreプロセッサー・ファミリー(IvyBridge)では、ハードウェアによる乱数発生ができます。インテル・コンパイラーの12.1ではこの乱数を発生する組み込み関数がサポートされています。乱数は16,32,64ビット長で発生できますが、32ビットの場合以下のコードを実行します。

#include "immintrin.h"

int main(){
unsigned int rd;

if(!_rdrand32_step(&rd)) printf("Invalid");
else printf("Rand is %u\n", rd);

}

まず、インクルードファイルimmintrin.hをインクルードします。

_rdrand32_step に32ビット符号なし変数のアドレスを渡します。
戻り値が0ならばエラーです。

このコードをコンパイルして、IvyBridge以外のプロセッサーで実行すると例外が発生します。CPUを識別するには、cpu_dispatch 機能を利用してください。

4:12 PM
2012年6月26日


iSUS編集部 – 菅原

投稿数 206

2

cpu_dispatch で Ivybridge を識別するには、12.1 コンパイラーでは、future_cpu_17 を利用します。しかし、これは将来変更されます。たぶんV13では正式名称が追加されます。以下のコードを参照ください。

#include
#include "immintrin.h"

__declspec(cpu_dispatch(future_cpu_17, generic ))
void dispatch_func() {};

__declspec(cpu_specific(future_cpu_17))
void dispatch_func() {
unsigned int rd;
int ret;

printf("\nCode for 3nd generation Intel Core processors\n");

ret = _rdrand32_step(&rd);
if(!ret) printf("Invalid");
else printf("Rand is %u\n", rd);

}

__declspec(cpu_specific(generic))
void dispatch_func() {
printf("\nCode for non-Intel processors and generic Intel processors goes here\n");
printf("Rand is %u\n", rand());
}

int main() {
dispatch_func();
printf("Return from dispatch_func\n");
return 0;
}

5:21 PM
2013年3月26日


iSUS編集部 – 菅原

投稿数 206

3

プロセッサー固有機能が利用可能かどうか判断するため、

extern int _may_i_use_cpu_feature(unsigned __int64);

を利用できます。この組込み関数はプロセッサーベンダーのチェックは行わないため、機能があるかどうかだけを確認できます。つまり、互換プロセッサーでも利用できます。

unsigned __int64 には、問い合わせる機能を _FEATURE_AVX などのを指定します。

まもなく関連記事をアップするので参照ください。

タグはありません