2012-08-31 171 views
2

我使用CURAND庫在CUDA中編寫隨機生成代碼。我讀到的關於隨機生成的內容讓我相信,如果我使用相同的種子,我會得到相同的隨機數。但是,當我測試它時,情況並非如此。請解釋我做錯了什麼。我粘貼代碼下面以供參考: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:624778773
1:3522650202
2:2363946744
3:1266286439
4: 3928747533
5:3732235839
6:1382638835
7:3362343509
8:48542993
9:1225999208
----------- 0 ----------------- -----
0:3356973615
1:1004333919
2:2916556602
3:1213079917
4:2705410958
5:520650207
6:1860816870
7:1645310928
8:2205755199
9:1282999252
----------- 1 ----------------------

回答

5

有是一個僞隨機生成器的「狀態」的概念。例如,Mersenne扭曲者的狀態大小約爲1024個字,而默認的一個XORWOW的狀態大小隻有幾個字(但它的週期也小得多)。

無論何時調用'setPseudoRandomGeneratorSeed',都可以初始化生成器的狀態。然後隨着對curandGenerate的後續調用,這個狀態將被更新(即從一個隨機數到下一個隨機數,狀態需要重新計算),因此隨機序列的不同部分將被生成。

您也可以嘗試驅動程序API - 這裏curandInit()初始化每個線程的狀態可能會非常昂貴。然後對curand()或curandUniform()等的後續調用將重用此狀態。事實上,每個線程從一個隨機序列的不同偏移量開始

+0

謝謝你的答案。所以你的意思是說我不需要爲不同的隨機數生成不同的種子,即使我使用相同的種子,我也會得到不同的隨機數集合? – user1439690

+0

是的,不需要爲每次調用curandGenerate()都生成隨機種子。您可以在每次程序運行時設置一次種子,即。使用'時間(空)'例如 – 2012-09-04 13:37:50

+0

我想我得到了解釋。 cuRandGenerator不會在播種時每次都重置偏移量,所以我得到了不同的隨機值集合。如果我在循環中創建並銷燬生成器,那麼我會得到相同的一組隨機值。 – user1439690

相關問題