2012-07-30 3 views
2

저는 CURAND 라이브러리 API를 읽었으며 CUDA에서 초보자입니다. 누군가 CURAND 라이브러리를 사용하여 임의의 숫자를 생성하는 간단한 코드를 실제로 보여줄 수 있는지 알고 싶었습니다. 이산 이벤트 시뮬레이션과 함께 사용할 많은 양의 숫자를 생성하려고합니다. GPGPU를 사용하여 난수 생성 속도를 높이는 알고리즘을 개발하는 것입니다. 표준 C 언어 프로그래밍에서 LCG, Multiplicative 및 Fibonacci 메서드를 구현했습니다. 그러나 나는 그 코드를 CUDA에 "포팅"하고 스레드와 블록을 이용하여 난수 생성 프로세스의 속도를 높이고 싶습니다.CUDA - 인형 용 CURAND 라이브러리 사용

링크 1 : http://adnanboz.wordpress.com/tag/nvidia-curand/

그 사람은 내가 (LCG와 메르 센 트위스터)가 필요하지만 코드가 많은 세부 사항을 제공하지 않는 방법이있다. 누군가가 초기 구현을 확장하여 실제로 올바르게 사용하는 방법을 올바른 방향으로 안내 할 수 있는지 궁금합니다.

감사합니다.

+0

간단한 CURAND 사용법을 보여준 SDK 예제 프로그램 중 PI의 Monte Carlo 추정이 있어야합니다. 예 : 몬테 카를로 아래의 EstimatePiP. 그것을 볼 기회가 있습니까? – njuffa

+0

그래, 나는 그것을 보았다. 그러나 난수 생성기의 예를 찾고 있습니다. 내가 개발 한 코드를 게시하기 위해 내 질문을 편집하여 작업하는 데 문제가 있습니다. –

+0

@njuffa 누구든지 공유하고 싶습니다/이것에 정교한? –

답변

4

당신의 질문은 오해의 소지가 있습니다 - 당신은 "cuRAND Library for Dummies 사용"이라고 말하고 실제로 cuRAND를 사용하고 싶지는 않습니다. 올바르게 이해하면 실제로 cuRAND에서 사용할 수있는 최적화 된 RNG를 사용하는 대신 자신의 RNG를 처음부터 구현하려고합니다.

  1. 먼저 권장 사항은 사용자 자신의 RNG를 사용하기로 결정한 것입니다. 왜 cuRAND를 사용하지 않을까요? 통계적 속성이 응용 프로그램에 적합한 경우 cuRAND를 사용하여 모든 세대의 GPU에 맞춰 조정하는 것이 훨씬 낫습니다. 그것은 Marsaglia의 XORWOW, I'Euuer의 MRG32k3a 및 MTGP32 Mersenne Twister (Sobol 'for Quasi-RNG)를 포함합니다.
  2. 간단한 RNG가있는 Thrust도 볼 수 있습니다 (예 : Monte Carlo sample 참조).
  3. 직접 생성기를 직접 생성해야하는 경우 GPU Computing Gems (에메랄드 에디션, 16 장 : 난수 생성기의 병렬화 기법)에 유용한 기술이 있습니다.

간단한 LCG는 빨리 건너 뛰기 쉽지만 일반적으로 다량의 그리기를 사용할 때는 일반적으로 fairly poor statistical properties입니다. "메르 센 트위스터"가 필요할 것이라고 말하면 MT19937을 의미한다고 가정합니다. 참조 된 Gems 책은 MT19937을 병렬화하는 것에 대해 이야기하지만 원래 개발자는 MT19937이 건너 뛰기를 구현하는 데 상당히 복잡하기 때문에 위의 MTGP 생성기를 만들었습니다.

또 다른 보조 메모로, 병렬 처리를 달성하기 위해 다른 시드를 사용하는 것은 일반적으로 나쁜 생각이며, 통계적으로 독립성을 보장하지는 않습니다. 건너 뛰거나 개구리를 뛰어 넘거나 시퀀스간에 상관 관계가 없음을 확인하기 위해 다른 기술 (예 : DCMT)을 사용해야합니다.