2012-08-31 2 views
2

CURDA 라이브러리를 사용하여 CUDA에서 무작위 생성 코드를 작성하고 있습니다. 내가 무작위 세대에 대해 읽은 것은 동일한 시드를 사용하면 동일한 난수 세트를 얻을 것이라고 믿게되었습니다. 하지만 그걸 시험 할 때가 아닙니다. 내가 뭘 잘못하고 있는지 설명해주세요. I는 기준 아래 코드를 붙여 오전 :CURAND가 동일한 시드로 다른 난수를 생성합니다.


curandGenerator_t rand_gen; 
    status = curandCreateGenerator (&rand_gen ,CURAND_RNG_PSEUDO_DEFAULT); 
    if(status != CURAND_STATUS_SUCCESS){ 
      printf("Error encountered in generating handle\n"); 
    } 
    status = curandSetPseudoRandomGeneratorSeed (rand_gen ,1234ULL); 
    if(status != CURAND_STATUS_SUCCESS){ 
      printf("Error encountered in setting seed\n"); 
    } 

    for(j=0; j<2; j++){ 
      status = curandGenerate(rand_gen,a_d,N); 
      if(status != CURAND_STATUS_SUCCESS){ 
        printf("Error encountered in generating random numbers\n"); 
      } 

      cudaMemcpy (a_h , a_d , N * sizeof(unsigned int),cudaMemcpyDeviceToHost); 
      for(i = 0; i < N; i++){ 
        printf("%d : %u\n",i,a_h[i]); 
      } 
      printf("-----------%d----------------------\n",j); 
    } 
    status = curandDestroyGenerator(rand_gen); 
    if(status != CURAND_STATUS_SUCCESS){ 
      printf("Error encountered in destroying handle\n"); 
    } 

출력 :

0 : 624,778,773
1 : 3,522,650,202
2 2,363,946,744
3 : 1266286439
4 : 3928747533
5 : 3732235839
,6 : 1382638835
7 : 3362343509
8 : 48,542,993
9 : 1225999208
----------- 0 ----------------- -----
0 : 3356973615
1 : 1,004,333,919
2 2,916,556,602
3 : 1213079917
4 : 2705410958
5 : 520,650,207
6 : 1860816870
7 : 1645310928
8 : 2205755199
9가 1,282,999,252
----------- 1 ----------------------

답변

5

의사 랜덤 생성기의 "상태"개념입니다. 예를 들어 Mersenne 트위스터의 크기는 약 1024 자이며 기본 XORWOW의 상태 크기는 여러 단어입니다 (단, 기간은 훨씬 짧습니다).

'setPseudoRandomGeneratorSeed'를 호출 할 때마다 생성기의 상태를 초기화합니다. 그런 다음 curandGenerate에 대한 후속 호출을 통해이 상태가 업데이트 (즉 임의의 숫자에서 다음 숫자로 이동하려면 상태를 다시 계산해야 함)하므로 임의 시퀀스의 다른 부분이 생성됩니다.

드라이버 API로 실험 해 볼 수도 있습니다. 여기 curandInit()은 매우 비쌀 수있는 각 스레드의 상태를 초기화합니다. curand() 또는 curandUniform() 등을 호출하면이 상태가 다시 사용됩니다. 실제로 각 스레드는 임의 순서의 다른 오프셋에서 시작합니다.

+0

해답을 가져 주셔서 감사합니다. 그래서 당신은 다른 난수에 대해 다른 씨앗을 생성 할 필요가 없다는 것을 의미하며, 동일한 씨드를 사용하더라도 다른 난수 세트를 얻을 것입니다. – user1439690

+0

예 curandGenerate()를 호출 할 때마다 임의의 시드를 생성 할 필요가 없습니다. 프로그램 실행 당 한 번 시드를 설정할 수 있습니다. 예를 들어 'time (NULL)'을 사용하면 –

+0

내가 설명을 가지고 있다고 생각합니다. cuRandGenerator는 시드 시마다 오프셋을 재설정하지 않으므로 다른 임의 값 집합을 얻습니다. 루프에서 생성기를 생성하고 파기하면 동일한 임의의 값을 갖게됩니다. – user1439690

관련 문제