2

我正在使用 CURAND 库在 CUDA 中编写随机生成代码。我读到的关于随机生成的内容让我相信,如果我使用相同的种子,我将得到相同的随机数集。但是当我测试它时,情况并非如此。请解释我做错了什么。我粘贴下面的代码以供参考:


    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:2363946444
3:3:326286439
4: 3:326286439 4:3:
3732235839 7:
3382235839
7:322599309
8: 1225999309
8 :
1225999208 - - - - - - - - - ------ 4
:2220575578 _ _ _ _ _ _ _ _ ------1------------------------









4

2 回答 2

5

有一个伪随机生成器的“状态”概念。例如,Mersenne twister 的状态大小约为 1024 个字,而默认的 XORWOW 的状态大小只有几个字(但它的周期也小得多)。

每当您调用“setPseudoRandomGeneratorSeed”时,您都会初始化生成器的状态。然后随着对 curandGenerate 的后续调用,该状态将被更新(即从一个随机数变为下一个,需要重新计算该状态),因此将生成随机序列的不同部分。

您还可以尝试使用驱动程序 API - 这里 curandInit() 初始化每个线程的状态,这可能非常昂贵。然后对 curand() 或 curandUniform() 等的后续调用将重用此状态。实际上每个线程都从一个随机序列的不同偏移量开始

于 2012-08-31T20:17:18.870 回答
-1

线程的调用是非常随机的,所以即使种子设置在主机上,每次运行都会产生不同的序列。

于 2019-02-26T00:02:33.393 回答