2013-01-19 3 views
10

Intel Digital Random Number Generator (DRNG) Software Implementation Guide을 검토 한 결과 RDRAND이 호출 될 때 발생 장치의 내부 상태에 대해 몇 가지 질문이 있습니다. 불행히도 대답은 가이드에없는 것 같습니다. 상기 안내에 따라 Ivy Bridge에서 RDRAND의 소모 특성은 무엇입니까?

  1. 상기 DRNG 내부 RDRAND 드레인위한 랜덤 비트를 제공 네 128 비트 버퍼가있다. RDRAND 자체를 제공 할 것 중 하나 (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의 처리량에 어떤 차이가 있습니까? 나는 필요 이상으로 무작위성을 소비하는 것을 피하고 싶다.

    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. 
    

    "를 사용할 수 없습니다"는 무엇을 의미 하는가 :

  2. 가이드는 RDRAND 실행 후 캐리 플래그가 설정됩니다라고? RDRAND 호출이 이러한 128 비트 버퍼를 너무 빨리 소모 했으므로 임의의 데이터를 사용할 수 없습니까? 또는 DRNG가 건강 검진을받지 못하고 새로운 데이터를 생성 할 수 없다는 것을 의미합니까? 기본적으로, 나는 RDRAND이 호출 될 때 버퍼가 (일시적으로) 비어 있기 때문에 CF = 0이 발생할 수 있는지 이해하려고합니다.

참고 : 나는 answersthis question on throughput and latency of RDRAND에,하지만 난 찾고있어 서로 다른 정보를 검토했습니다.

감사합니다. 2에 대해서는

+2

['rdrand' 처리량은 IvB에서 110 사이클마다 하나, Skylake에서 ~ 460 사이클당 하나씩입니다] (http://agner.org/optimize/).64bits를 얻고 동시에 여러 개의 작은 난수를 사용하는 경우, 또는 난수가 많이 필요한 경우 더 빠른 PRNG를 시드하려면'rdseed '를 사용하는 것이 좋습니다. 단지 16uops이지만 대기 시간은 길고 링크 된 질문에 대한 데이비드의 대답은 결과를 즉시 사용할 때 파이프 라인을 정지시키는 경향이 있음을 나타냅니다. 사람들은 숫자를 사용하는 계산에 미치는 영향이 아니라 RNG 처리량을 측정하는 것으로 보입니다. –

답변

18

1 부. 16,32 또는 64 비트를 변경하는 데 차이가 있습니까?

아이비 다리

는 CPU 코어없이 목적지 레지스터의 크기는 DRNG의 내부 통신 링크를 통해 64 개 비트를 당긴다. 따라서 32 비트를 읽으면 64 비트를 가져와 상위 절반을 버립니다. 16 비트를 읽으면 64를 당겨 상위 3/4을 버립니다.

이것은 향후 제품에서 계속 유지되지 않을 수 있으므로 지침 설명서에 설명되어 있지 않습니다. 64 비트 워드의 사용되지 않는 부분을 숨기고 사용하는 칩이 설계 될 수 있습니다. 그러나 오늘날이 작업을 수행하는 데 중요한 성과는 없습니다.

최상의 처리량을 얻으려면 가장 효과적인 전략은 병렬 스레드를 가져 오는 것입니다. 이것은 칩상의 버스 계층 구조에 병렬이 있기 때문입니다. 대부분의 시간은 버스를 가로 지르는 교통 시간입니다. 전송을 병렬로 수행하면 최대 800MBytes/s의 스레드 수에서 처리량이 선형 적으로 증가합니다. 두 번째로 64 비트 RdRands를 사용하는 것은 명령 당 더 많은 데이터를 얻기 때문입니다.

2 부. CF = 0은 실제로 무엇을 의미합니까?

'임의의 데이터를 사용할 수 없음'을 의미합니다. 왜냐하면 왜 숫자를 얻을 수 없는지에 대한 세부 사항은 CPU 코어가 사용하지 않고서 더 많은 레지스터를 읽지 않고도 사용할 수 없기 때문입니다. 정보를 가지고 할 수있는 일이 없기 때문에 그렇게하지 않을 것입니다.

DRNG의 출력 버퍼를 빨아 들인 경우 언더 플로 (CF = 0)가 발생하지만 DRNG가 빠르기 때문에 다음 RdRand가 성공할 것으로 기대할 수 있습니다.

DRNG가 실패한 경우 (예 : 트랜지스터가 엔트로피 소스에서 튀어 나와 더 이상 무작위 적이 지 않음) 온라인 상태 테스트에서이를 감지하고 DRNG를 종료합니다. 그러면 모든 RdRand 호출이 CF = 0이됩니다.

그러나 Ivy Bridge에서는 버퍼를 언더 플로 할 수 없습니다. DRNG는 연결된 버스보다 약간 빠릅니다. 병렬 스레드를 사용하여 단위 시간당 더 많은 데이터를 가져 오는 효과는 각 개별 RdRand의 실행 시간을 늘리는 것입니다. 버스에서의 경쟁으로 인해 명령이 DRNG의 로컬 버스에서 줄을 서서 기다려야하기 때문입니다. DRNG가 언더 플로우 할 확률은 너무 빠르지 않습니다. 당신은 800MBytes/s에 점근 적으로 도달 할 것입니다.

향후 제품에서도이 내용이 계속 유지되지 않을 수 있으므로 문서에도 설명되어 있지 않습니다. 버스가 더 빠르고 코어가 더 빨라지고 DRNG가 언더 플로우 될 수있는 제품을 생각할 수 있습니다. 이러한 것들은 아직 알려지지 않았기 때문에 우리는 그들에 대한 주장을 할 수 없습니다.

사실로 남아있는 사실은 소프트웨어 구현 자 안내서에 제공된 기본 루프 (최대 10 번 시도한 다음 스택의 실패를보고 함)가 향후 제품에서 계속 작동한다는 것입니다. 미래의 모든 제품을 설계하여이를 충족시킬 것입니다.

Ivy Bridge에서 "RDRAND가 호출 될 때 버퍼가 일시적으로 비어 있지만"향후 실리콘에서 발생할 수 있으므로 CF = 0을 사용할 수 없으므로 소프트웨어를 적절하게 설계하십시오.

2

: http://download.intel.com/products/processor/manual/253665.pdf를 7.3.17

CF는 임의의 데이터에 대한 요구가 DRNG의 처리량을 초과하는 것을 나타낸다. 1에 관한

: 다시 명령을 호출 할 필요가 전에

당신이 걱정 성능이 경우

의 DRNG에서 64 비트 임의의 값을 읽을 왜, 당신은 그 32 배에서 2 비트를 읽을 수 있습니다. 비트가 필요할 때마다 새로운 rdrand를 호출 할 필요가 없습니다.

+0

링크를 제공해 주셔서 감사합니다! 큰 결과를 가져 와서 필요에 따라 잘라내는 일은 복잡하고 일종의 동기화가 필요한 내 자신의 상태를 어딘가에 유지해야합니다. DRNG의 하드웨어 관리 상태에 전적으로 의존하면서 무작위 비트를 과도하게 사용하지 않으려합니다. – cambecc

5

DRNG 출력의 4 * 128 비트 FIFO에 내용을 읽지 마십시오. 그것은 확실히 거기에 (나는 거기에 넣어)하지만 그것은 소프트웨어 시각 효과가 뭔가가 아닙니다. DRNG의 논리는 데이터를 원활하게 생성하지 못합니다. SP800-90 사양에 따라 다시 시드 또는 컨디셔닝과 같은 다른 작업을 계획하는 경우가 있습니다. 따라서로드중인 데이터의 흐름은 불규칙합니다.

최악의 스케줄링 여행을 고려할 때 800MBytes/s (로컬로 연결된 버스의 속도) 4에서 최대 속도로 당길 때 언더 플로우를 방지 할 수있을만큼 깊이가 있기 때문에 4의 버퍼 길이가 선택되었습니다. 출력에 중단없이 일정하고 부드러운 800MByte/s 전원.

첨부 된 버스의 속도가 느린 경우 언더 플로를 방지하기 위해 버퍼가 짧아지기 때문에 버퍼가 짧아집니다.