12

インテルデジタル乱数ジェネレーター(DRNG)ソフトウェア実装ガイドを確認した後、RDRANDが呼び出されたときにジェネレーターの内部状態がどうなるかについて、いくつか質問があります。残念ながら、答えはガイドに載っていないようです。

  1. ガイドによると、DRNGの内部には、ドレイン用のランダムビットを提供する4つの128ビットバッファがありますRDRANDRDRANDそれ自体は、デスティネーションレジスタの幅に応じて、16、32、または64ビットのランダムデータを提供します。

    rdrand ax   ; put 16 random bits in ax
    rdrand eax  ; put 32 random bits in eax
    rdrand rax  ; put 64 random bits in rax
    

    より大きなデスティネーションレジスタを使用すると、それらの128ビットバッファがより早く空になりますか?たとえば、2ビットのランダム性のみが必要な場合、64ビットレジスタではなく16ビットレジスタを使用するという問題を解決する必要がありますか?それはDRNGのスループットに何か違いがありますか?必要以上にランダム性を消費することは避けたいと思います。

  2. RDRANDガイドによると、実行後にキャリーフラグが設定されます。

    CF = 1   Destination register valid. Non-zero random value
             available at time of execution. Result placed in register.
    CF = 0   Destination register all zeros. Random value not available
             at time of execution. May be retried.
    

    「利用不可」とはどういう意味ですか?RDRAND呼び出しによってこれらの128ビットバッファがすぐに使い果たされたために、ランダムデータを使用できなくなる可能性がありますか?または、使用不可とは、DRNGがヘルスチェックに失敗し、新しいデータを生成できないことを意味しますか?RDRAND基本的に、が呼び出されたときにバッファが(一時的に)空であるという理由だけでCF=0が発生する可能性があるかどうかを理解しようとしています。

注:RDRANDのスループットとレイテンシーに関するこの質問への回答を確認しましたが、別の情報を探しています。

ありがとう!

4

3 に答える 3

19

パート1。16、32、または64ビットをプルすることで違いはありますか?

いいえ。

Ivy Bridgeでは、CPUコアは、宛先レジスタのサイズに関係なく、DRNGへの内部通信リンクを介して64ビットをプルします。したがって、32ビットを読み取ると、64ビットがプルされ、上半分が破棄されます。16ビットを読み取ると、64がプルされ、上位3/4が破棄されます。

これは、将来の製品では引き続き当てはまらない可能性があるため、取扱説明書には記載されていません。64ビットワードの未使用部分を隠して使用するチップが設計されている可能性があります。ただし、今日これを行うために不可欠な重要なパフォーマンスはありません。

最高のスループットを得るには、最も効果的な戦略は並列スレッドからプルすることです。これは、チップ上のバス階層に並列処理があるためです。指導の時間のほとんどは、バスを通過する時間です。そのトランジットを並行して実行すると、最大800MBytes / sまで、スレッド数に応じてスループットが直線的に増加します。2つ目は、64ビットのRdRandを使用することです。これは、命令ごとにより多くのデータを取得するためです。

パート2。CF=0は実際にはどういう意味ですか?

「ランダムデータが利用できない」という意味です。これは、CPUコアが数値を取得できない理由の詳細は、CPUコアがオフになり、レジスターをさらに読み取ることなしには利用できないためです。これは、情報では何もできないため、実行できません。

DRNGの出力バッファーを吸い取って乾かすと、アンダーフロー(CF = 0)が発生しますが、DRNGは高速であるため、次のRdRandが成功することが期待できます。

DRNGが失敗した場合(たとえば、トランジスタがエントロピーソースにポップされ、ランダムではなくなった場合)、オンラインヘルステストでこれが検出され、DRNGがシャットダウンされます。次に、すべてのRdRand呼び出しでCF=0が生成されます。

ただし、Ivy Bridgeでは、バッファをアンダーフローすることはできません。DRNGは、接続されているバスよりも少し高速です。(並列スレッドを使用して)単位時間あたりにより多くのデータをプルすると、バスでの競合により命令がDRNGのローカルバスでインラインで待機する必要があるため、個々のRdRandの実行時間が長くなります。DRNGがアンダーフローするほど速く引っ張ることはできません。漸近的に800MBytes/sに到達します。

これは、将来の製品では引き続き当てはまらない可能性があるため、ドキュメントにも記載されていません。バスが高速でコアが高速で、DRNGがアンダーフローできる製品を想定できます。これらのことはまだ知られていないので、私たちはそれらについて主張することはできません。

ソフトウェア実装ガイドに記載されている基本的なループ(最大10回試行してから、スタックの障害を報告する)は、今後も機能すると主張しているため、今後も機能し続けるということです。これに対応するために、将来のすべての製品を設計します。

いいえ、CF = 0は、Ivy Bridgeで「RDRANDが呼び出されたときにバッファが(一時的に)空になる」ため発生しませんが、将来のシリコンで発生する可能性があるため、対処するようにソフトウェアを設計してください。

于 2013-01-21T17:11:21.643 に答える
4

DRNG出力の4*128ビットFIFOには何も読み込まないでください。それは確かにそこにあります(私はそこに置きます)が、ソフトウェアの目に見える効果を持つものではありません。DRNGの背後にあるロジックは、データをスムーズに生成しません。SP800-90仕様に従って、再シードやコンディショニングなどの他のスケジュールを設定する場合があります。したがって、負荷がかかった状態でのデータの流れは不規則です。

バッファ長4が選択されたのは、800MBytes / s(ローカルに接続されたバスの速度)で、最悪の場合のスケジューリングエクスカーションを考慮して、最大速度でプルするときにアンダーフローを防ぐのに十分な深さであるため、一定のスムーズな800MByteが存在するためです。 / sは、出力を中断することなく供給します。

接続されているバスの速度が遅い場合、アンダーフローを防ぐにはバッファを短くするだけで十分なので、バッファは短くなります。

于 2013-01-26T06:36:23.973 に答える
2

2について: http : //download.intel.com/products/processor/manual/253665.pdf、7.3.17

CFは、ランダムデータの需要がDRNGのスループットを超えていることを示しています。

1について:

パフォーマンスが気になる場合は、DRNGから64ビットのランダムな値を読み取ってみてください。命令を再度呼び出す前に、その32ビットから2ビットを読み取ることができます。ビットする必要があるたびに新しいrdrandを呼び出す必要はありません。

于 2013-01-20T07:47:23.843 に答える