2013-08-20 4 views
1

CURAND를 사용하여 난수를 생성하고 있습니다. 나는 3600 만개의 난수 인 3 개의 배열을 채우기 위해 curandGenerator_t을 만들었습니다. 각 어레이에는 서로 다른 시드가 있습니다. 수 세대가 더 많거나 적은이 같은 루프 내에서 수행됩니다CURAND가 더 느리게 실행 중입니다.

curandGenerator_t randGenerator; 
curandCreateGenerator(&randGenerator, CURAND_RNG_PSEUDO_DEFAULT); 

for(i = 0; i < 100; i++) 
{ 
    curandSetStream(randGenerator, stream[0]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[0]); 
    curandGenerateUniformDouble(randGenerator, d_rv0, N); 

    curandSetStream(randGenerator, stream[1]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[1]); 
    curandGenerateUniformDouble(randGenerator, d_rv1, N); 

    curandSetStream(randGenerator, stream[2]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[2]); 
    curandGenerateUniformDouble(randGenerator, d_rv2, N); 
} 

내가지고있어 결과가 예상되는이 있지만 응용 프로그램을 프로파일 링 후 나는 깨달았다 그것은 잘 작동하는 루프 생성의 몇 가지 반복 후 난수가 더 느려집니다. 다음 이미지에서 파란 녹색 항목은 100ms에서 1s로 이동합니다.

난수 생성의 정상적인 동작인지 누군가가 설명 할 수 있습니까?

3 개의 다른 씨앗과 하나의 curand 생성자로 임의의 숫자를 생성하는 것을 잘못하고 있습니까?

enter image description here

답변

6
  1. 나는 당신의 프로파일 링 결과를 다시 만들 수 없습니다, 나는 루프의 둔화 효과를 얻을 수 없습니다.
  2. 나는 curand를 잘못된 방법으로 사용하고 있다고 생각합니다.

일반적으로 curandSetSeed()curandCreateGenerator() 이후에 한 번만 사용해야합니다.

코드에서 임의의 숫자를 생성하기 전에 매번이 코드를 사용하여 생성기를 동일한 상태 w.r.t로 재설정합니다. 씨앗. 코드에 d_rv0을 100 번 입력했지만 실제로 매번 동일한 N 난수로 채우고 있습니다.

이렇게하려는 경우 N 난수를 한 번 생성 한 다음 100 번 복사 할 수 있습니다.

그렇지 않은 경우 curandSetSeed()을 루프 밖으로 이동할 수 있습니다.

반면에 3 종자를 사용하는 목적은 무엇입니까? 프로그램에서 반복 가능한 결과를 얻으려면 1 개의 씨앗이면 충분합니다. 별도의 난수 스트림을 유지하려는 경우 각각 1 개의 시드가있는 3 개의 생성기가 필요합니다.

+0

나는 종자를 바꾼 후에도 발전기가 상태를 저장했다. 그리고 난 정말 3 가지 다른 임의의 스트림에 대해 3 가지 다른 씨앗이 필요합니다. 나는 그것을보고 어떻게 움직이는 지 볼 것이다. 문제가 계속되면 다시 게시 할 것입니다. – BRabbit27

+0

문제는 실제로'curandSetSeed()'와 똑같은 테스트를 실행했는데 더 이상 느려지는 효과가 없으며 사실 더 빨라졌습니다. – BRabbit27

관련 문제