병렬 의사 난수 생성기


20

이 질문은 주로 실용적인 소프트웨어 엔지니어링 문제와 관련이 있지만 이론가들이 더 많은 통찰력을 제공 할 수 있는지 궁금합니다.


간단히 말하면, 의사 난수 생성기를 사용하는 Monte Carlo 시뮬레이션이 있으며 동일한 시뮬레이션을 병렬로 실행하는 1000 대의 컴퓨터가 있도록 병렬화하고 싶습니다. 따라서 1000 개의 독립적 인 의사 난수 스트림이 필요합니다.

다음과 같은 속성을 가진 1000 개의 병렬 스트림을 가질 수 있습니까? 여기서 는 모든 종류의 훌륭한 이론적 및 경험적 특성을 가진 매우 유명하고 널리 연구 된 PRNG 여야합니다.X

  1. 스트림은 단순히 를 사용 하고 에 의해 생성 된 스트림을 1000 스트림으로 분할하면 얻을 수있는 것만 큼 좋을 것 입니다.XX

  2. 스트림에서 다음 숫자를 생성하는 것은 다음 숫자를 생성하는 것만 큼 빠릅니다 .X

달리 말해 : "무료"로 여러 개의 독립적 인 스트림을 얻을 수 있습니까?

물론 우리가 단순히 를 사용 X하고 항상 999 개의 숫자를 버리고 1을 고르면 반드시 1의 속성을 가지게되지만, 실행 시간에는 요소 1000만큼 잃게됩니다.

간단한 아이디어는 시드 1, 2, ..., 1000과 함께 1000 개의 사본을 사용하는 X것입니다. 이것은 확실히 빠르지 만 스트림에 우수한 통계적 속성이 있는지는 분명하지 않습니다.


인터넷 검색 후 예를 들어 다음을 발견했습니다.

  • SPRNG의 라이브러리는 정확히 이러한 목적을 위해 설계되는 것, 그리고 그것을 지원하는 여러 PRNG도를 .

  • 메르 센 트위스터 는 요즘 인기있는 PRNG 인 것처럼 보이며 여러 스트림을 병렬로 생성 할 수있는 변형에 대한 참조를 발견했습니다.

그러나이 모든 것이 제 연구 분야와는 거리가 멀기 때문에 실제로 최신 기술이 무엇인지, 그리고 이론적으로뿐만 아니라 실제로 어떤 구조가 잘 작동하는지 알 수 없었습니다.


몇 가지 설명 : 나는 어떤 종류의 암호화 속성이 필요하지 않습니다. 이것은 과학적 계산을위한 것입니다. 수십억 개의 난수가 필요하므로 기간의 발전기를 잊을 수 있습니다 <232.

편집 : 나는 진정한 RNG를 사용할 수 없습니다; 결정적인 PRNG가 필요합니다. 첫째, 디버깅에 많은 도움이되고 모든 것이 반복 가능해집니다. 둘째, 다중 패스 모델을 사용할 수 있다는 사실을 이용하여 예를 들어 중간 값 찾기를 매우 효율적으로 수행 할 수 있습니다 ( 이 질문 참조 ).

편집 2 : @StackOverflow : 클러스터 환경에 대한 의사 난수 생성기 와 밀접한 관련이 있습니다 .


6
왜 독립적으로 샘플링 된 씨앗 개로 PRNG를 사용하지 않습니까? 나는 서로 다른 기계 사이에 조정이 필요하지 않기 때문에 이것이 1과 2를 어떻게 만족시키지 못하는지 이해하지 못합니다1000
Sasho Nikolov

나는 전문가가 아니지만 최근에 (TCS 질문에 대한 정보를 검색하는 중) 나는 다음 하드웨어를 발견했습니다. idquantique.com/true-random-number-generator/… ... (양자) 난수 비트. ... 당신은 그들의 무리를 구입하고 몇 개의 난수 생성기 서버를 구현할 수 있습니다 ... 훌륭한 이론적 접근법은 아니지만 비트는 "좋은"것으로 보장됩니다 :-) :-)
Marzio De Biasi

@Vor : 모든 것을 반복적이고 결정적으로 유지하고 싶습니다. 고정 된 씨앗이 주어지면 실험을 다시 실행하면 정확히 동일한 결과를 얻고 싶습니다. 그리고 단일 컴퓨터에서 동일한 실험을 실행하고 다시 동일한 결과를 얻을 수 있기를 원합니다. (하나의 경우 병렬 알고리즘을 디버깅 할 때 많은 도움이됩니다 ...)
Jukka Suomela

@ Juka : 알았어! ... 그리고 실험 결과와 함께 수십억 개의 압축 불가능한 와일드 비트를 저장하는 것이 그렇게 실현 가능하지 않다고 생각합니다 :-) ... PRNG 전문가가 필요합니다!
Marzio De Biasi

2
지금까지 답변 주셔서 감사합니다! 현상금에 더 많은 참여를하는지 보자 ...
Jukka Suomela

답변:


7

Saito와 Matsumoto가 개발 한 Mersenne Twister 알고리즘의 진화를 사용할 수 있습니다.

SIMD 지향 고속 메르 센 트위스터 (SFMT)

SFMT는 한 단계에서 128 비트 의사 난수 정수를 생성하는 LFSR (Linear Feedbacked Shift Register) 생성기입니다. SFMT는 다단계 파이프 라이닝 및 SIMD (예 : 128 비트 정수) 명령어와 같은 최신 CPU의 병렬 처리를 위해 설계되었습니다. 32 비트 및 64 비트 정수와 배정 밀도 부동 소수점을 출력으로 지원합니다. SFMT는 대부분의 플랫폼에서 MT보다 훨씬 빠릅니다. v- 비트 정밀도에서 속도뿐만 아니라 등분 포의 치수도 개선되었습니다. 또한 0 초과 초기 상태에서 복구하는 것이 훨씬 빠릅니다. 자세한 내용은 사이토 무츠 오 석사 논문을 참조하십시오 .

기간이 다르다 2 216,091 - 1 .2607122160911

초기 값을 변경하여 여러 개의 독립적 인 스트림을 생성하기 위해 하나의 동일한 의사 난수 생성기를 사용하면 문제가 발생할 가능성이 거의 없습니다. 문제를 피하려면 각 세대마다 다른 매개 변수를 사용하는 것이 좋습니다. 이 기법을 MT 파라미터의 동적 생성 이라고 합니다.

SFMT 소스 코드에는 가변 기간의 매개 변수 세트와 CSV 파일을 컴파일 가능한 매개 변수 세트로 변환하는 awk 스크립트의 일부 예가 있습니다. " 메르 센 트위스터 생성기의 동적 생성 "이라는 도구도 있습니다 .

저자는 최근 GPU에서 실행하고 기본 병렬 실행 스레드를 활용하도록 설계된 또 다른 수정 된 버전의 Mersenne Twister ( 그래픽 프로세서 용 Mersenne Twister)를 개발했습니다. 주요 기능은 속도입니다 : GeForce GTX 260에서 4.6ms마다 임의 정수.5×107

생성 된 시퀀스의주기는 , 2 23,209 - 12 44,497 - 1 32 비트 버전 및 (2) 23,209 - 1 , 2 44,497 - 1 , 2 110,503 - 1 64 비트 버전. 각주기마다 128 개의 매개 변수 세트를 지원합니다. 즉, 각주기마다 128 개의 독립적 인 의사 난수 시퀀스를 생성 할 수 있습니다. 더 많은 파라미터 세트를 생성하는 MTGP 용 Dynamic Creator를 개발했습니다.2112131223209124449712232091244497121105031

실제로 이들은 최대 2 개의 32 개의 파라미터 세트 (즉, 독립 스트림) 를 생성 하는 MTGPDC 도구 를 제공합니다 .232

이 알고리즘은 Diehard 및 NIST와 같은 주요 임의성 테스트를 통과합니다.

arXiv : 그래픽 프로세서에 적합한 Mersenne Twister의 변형 에 대한 예비 문서도 제공됩니다.


관련이 있지만 오래된 도구는 Matsumoto와 Nishimura (1998) : 의사 난수 생성기의 동적 생성입니다 . 그러나 나는이 도구들 중 어떤 도구가 단순한 개념 증명이며 널리 사용되는 업계 강도의 소프트웨어 패키지인지 파악할 수 없었습니다.
Jukka Suomela 2016 년

@ Jukka : 아마도 MTGP 알고리즘의 저자에게 직접 요청할 수 있습니다. 그들의 사이트에서 : "... 모든 의견을 환영합니다 (사이토 무츠 오에게 이메일을 보내시오.") "math sign.sci.hiroshima-u.ac.jp"및 m-mat "at sign"math.sci.hiroshima- u.ac.jp) ... ". 아마도 그들은 100 % 공정하지 않을 수도 있지만 MTGP의 강점과 약점을 잘 알고 있으며 그것이 당신의 지갑에 적합한 지 알려줄 수 있습니다.
Marzio De Biasi 2016 년

Mersenne Twister + Dynamic Creation이 Mathematica에서 권장되는 방법 인 것 같습니다 .
Jukka Suomela

@Jukka : MT + DC 패키지는 Matsumoto 사이트에서도 찾을 수 있습니다 ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); MTGP는 GPU에 적합한 변형 일뿐입니다. MT + DC는 (당신이 절대적으로 필요하지 않는 한 더 나은 (및 테스트 / 안정적) 선택의 여지가 보인다 그래서 )) 임의의 정수 각 스트림의 모든 4.6ms :-))5×107
MARZIO 드 BIASI을

@Vor : 답변을 편집하고 MTGP를 dcmt바꾸면 받아 들일 수 있습니다.
Jukka Suomela

12

이 문제를 해결하는 방법은 여러 가지가 있지만 Blum Blum Shub PRNG 를 사용하는 간단한 방법이 있습니다 . 이 PRNG는 재귀 관계 의해 정의되며 , 여기서 N 은 반 프라임입니다. 이것에서 임의의 비트를 얻으려면 단순히 x i 의 비트 패리티를 취할 수 있습니다 . 이것에 대한 좋은 점은 x i + k = x 2 k i  mod  N = x 2 k  mod  λ ( N ) ixi+1=xi2 mod NNxi 모듈 식 지수에 사용하는 곱셈 알고리즘에 따라 k (즉, O ( log ( N ) 3 ) 이상인시간 상수의 모든 단계를 직접 계산할 수 있습니다. 따라서 M 기계가 있고 y로 색인을 생성 한 기계의경우 발전기 x i + 1 , y = x 2 M mod  λ ( N ) i  mod  N을 사용할 수 있습니다 . 여기서 x 0 , y = xxi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod N여기서x0은 시드입니다. 편리하게 이것은 단일 스트림을 사용하여 차례로 각 머신에 출력하는 것과 동일한 수의 스트림을 생성합니다.x0,y=x02y mod λ(N) mod Nx0

이것은 PRNG 중에서 가장 빠르지는 않으므로 시뮬레이션에서 수행하는 작업의 오버 헤드가 PRNG 비용보다 훨씬 큰 경우에만 유용합니다. 그러나 훨씬 더 빨리 특정 조합 될 것이라고 지적 가치가 N 의 이진 표현하는 경우 특히 다른 사람보다 2 M  모드  λ ( N은 ) 몇 초를 포함하거나 작다.MN2M mod λ(N)


1
각 기계가 시퀀스의 연속 부분을 생성하여 멀리 떨어져 있지 않도록 간격을 두는 것이 더 빠를 것이라고 생각합니다. 어쨌든, 비 암호화 응용 프로그램에 Blum Blum Shub을 사용하면 약간 과잉 것 같습니다.
안토니오 Valerio Miceli-Barone

1
@Antonio : 그렇습니다. 특히 얼마나 많은 시험이 필요한지 미리 알고 있다면 약간 더 빠를 것입니다. 당신이 모른다면, 나는 당신이 어느 쪽이든 같은 스케일링을 얻을 것이라고 생각합니다. Wierdly Blum Blum Shub은 수년 전에 우리가 계산 물리학에서 생각했던 PRNG였습니다. 암호화 목적으로 사용하지 않으면 훨씬 작은 모듈러스를 사용할 수 있으므로 실제로 그렇게 느리지는 않으며 많은 작업의 경우 계산 해야하는 임의 변수의 기능에 비해 빠릅니다.
Joe Fitzsimons 2018 년

5

전처리 단계는 어떻습니까? 임의의 씨앗을 감안할 때 (크기의 N ), 실행 X 크기의 의사 스트림을 얻기 위해 1000 N을 . 이 스트림을 s 1 , s 2 , , s 1000으로 나타내십시오 . 여기서 1 i 1000의 경우 s i 는 크기 n 스트림의 연속적인 부분입니다 .snX1000ns1,s2,,s10001i1000sin

이 전처리 단계는 가 효율적인 PRNG 라는 사실을 감안할 때 매우 낮은 오버 헤드로 수행 할 수 있습니다 (오늘날 PRNG가 매우 빠름).X

이제 i 번째 머신 의 시드로 지정하십시오.이 머신은 X 를 사용하여 자체 의사 난수 스트림을 생성합니다.siiX

의 좋은 특성을 감안할 때 하지 않는 한, 의는 알려진 어떤을 위해, 1 나는 < J 1000 , 씨앗 j는 계산 독립적이다. 또한 하나의 작은 시드 (예 : s ) 만 생성하고 저장하면됩니다 . 따라서이 접근 방식에는 많은 양의 진정한 임의성 또는 스토리지가 필요하지 않습니다.Xs1i<j1000sisjs


이것은 @Antonio가 제안한 것과 본질적으로 같은 접근법이 아닌가? PRNG를 사용하여 시드를 생성하십시오. 나는 이것에 대해 약간 불안한 느낌을 가지고 있습니다 ... 잘못 될 수있는 사소한 예를 제공하기 위해 출력 = 내부 상태이고 시드가 단순히 내부 상태를 설정하는 PRNG를 고려하십시오.
Jukka Suomela

@ Jukka : 내 접근 방식은 Antonio와 비슷하지만 내 것이 더 일반적입니다. 예제의 PRNG (출력 = 내부 상태)는 암호화 적으로 안전하지 않은 것 같습니다. PRNG는 출력이 균일 한 분포와 계산 상 구별 할 수없는 경우 암호로 안전합니다. 자세한 내용은 이것을 참조하십시오 . PS : Blum-Blum-Shub PRNG는이 조건을 만족시킵니다.
MS Dousti 2016 년

2

fM=1000{0,1,,M1}jif(i+jM)M

모든 프로세스에서 암호화 RNG를 제공하지만 성능 비용이 반드시 필요한 것은 아닙니다. 하드웨어를 지원하면 AES가 빠르며 ChaCha는 빠릅니다. 물론 특정 설정에서이 값을 측정해야합니다.

f


나는 않으면 하지 예를 들어 암호화 강도, 방법 차차 (카운터)와 비교하면, 메르 센 트위스터에 관심? 더 빠르거나 느려 집니까? 최소한 좋은 통계적 속성을 가지고 있습니까? Google을 시도했지만 암호화되지 않은 컨텍스트 에서이 두 가지를 비교하는 기사를 찾지 못했습니다.
Jukka Suomela 2016 년

2

SFMT (빠른 Mersenne Twister 구현)를 위한 점프 기능 이 있습니다 .

이렇게하면 사이클 겹침이 없도록 1000 MT를 초기화 할 수 있습니다. SFMT는 MTGP보다 빠릅니다. 내 목적에 거의 완벽합니다.


1

다른 시드로 초기화 된 Mersenne Twister 인스턴스를 1000 개만 사용할 수 있습니다.

다른 Mersenne Twister 또는 OS 암호화 의사 난수 생성기 (Linux의 / dev / urandom)에서 독립성을 확인하기 위해 시드를 샘플링 할 수 있습니다.

Mersenne Twister는 항상 동일한 순환 시퀀스에서 작동하며, 시드는 생성주기를 제어합니다. 독립적으로 샘플링 된 시드를 사용하면 각 생성기는 교차 가능성이 매우 낮은 다른 일반적으로 매우 먼 지점에서 시작합니다.


그래서 MT는 다른 MT로 MT를 파종하는 것이 합리적임을 보장하는 멋진 특성을 가지고 있습니까?
Jukka Suomela

MT는 가능한 의사 난수 특성을 가지고 있습니까?
Sasho Nikolov

@ Juka : 내가 아는 것은 없습니다. 그렇기 때문에 이상한 알 수없는 종류의 상관 관계가 특히 두려운 경우 파종에 다른 유형의 PRNG를 사용하는 것이 좋습니다.
안토니오 Valerio Miceli-Barone

@Sasho : Wikipedia 페이지에는 k- 분포와 큰 기간이 언급되어 있습니다.
안토니오 Valerio Miceli-Barone

1
kk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.