2013-03-08 2 views
4

CUDA의 임의 생성기와 관련하여 질문이 있습니다. 나는 다음과 같은 코드를 사용하여 난수를 생성하는 Curand을 사용하고 있습니다 :이 코드를 여러 번 다시 시작하는 것을 시도했다임의 생성기 및 CUDA

__device__ float priceValue(int threadid){ 

    unsigned int seed = threadid ; 
    curandState s; 
    curand_init (seed , 0, 0, &s); 

    float randomWalk = 2; 
    while (abs(randomWalk)> 1) { 
     randomWalk = curand_normal(&s); 
    } 
    return randomWalk; 
} 

, 나는 항상 동일한 출력을 가지고있다. 이 코드에서 잘못된 점을 발견하지 못했습니다. 스레드는 동일한 ID를 제공하지만 curand_normal 함수는 시작될 때마다 바뀌어야합니다. 맞습니까?

+1

같은 씨앗을 때마다 각 스레드를 시작, 그 threadid. 시퀀스가 어떻게 다른 것으로 기대할 수 있습니까? –

+0

실제로 매번 새로운 시드를 설정할 시간을 사용하고 싶지만이 솔루션에 대해서는 확실하지 않습니다. – ALFRAM

답변

3

임의 값을 요청할 때마다 init을 실행 중입니다. 대신 코드 시작 부분에 별도의 커널에 curand_init()을 한 번 실행해야합니다. 그런 다음 임의의 값을 새로 지정하려면 curand_normal()으로 전화하십시오. 그런 다음 장치 기능을 호출 할 때마다 값이 변경됩니다.

예를 보려면 내 대답 here을 참조하십시오.

당신은 대신 스레드 ID의 씨앗으로 시간을 사용 후 the valueclock()에 의해 반환 전달하거나 좋아하는 시간 함수 뭐든하려면 :

unsigned int seed = (unsigned int) clock64(); 
+1

curand_init()가 호스트에서 호출 할 수 있으면 좋을 것입니다. 당신은 init curand에 전체 함수를 작성하고 있습니다! –

관련 문제