2015-07-03 86 views
-2

我想在cuda中实现这个功能作为设备/全局函数,以便获得高斯分布的随机数。在cuda中实现随机发生器

double gasdev2() { 
double ran3n(long *seed); 
// double genrand64_real3(); 
static int iset=0; 
static double gcos; 
double tmp1,tmp2; 

if (iset==0) { 
tmp1=sqrt(-2*log(ran3n(&seed))); 
tmp2=pi2*ran3n(&seed); 
// tmp1=sqrt(-2*log(genrand64_real3())); 
// tmp2=pi2*genrand64_real3(); 
    gcos=tmp1*cos(tmp2); 
iset=1; 
return tmp1*sin(tmp2); 
//return 1; 
}else{ 
    iset=0; 
    return gcos; 
//return 1; 
} 
} 

这个功能将在这些函数调用和串行代码基本上使用这些都是这样

for(int i=0;i<NTO;i++){ 
    Frdx[j]=gasdev2()*ranm[j]*tconst; 
    Frdy[j]=gasdev2()*ranm[j]*tconst; 
    Frdz[j]=gasdev2()*ranm[j]*tconst; 
    } 

回答

2

我建议不要自己实现它,但使用Thrust提供的随机算法:

uint32_t seed = 1234; 
thrust::default_random_engine rng(seed); 
thrust::uniform_real_distribution<float> dist(0.0f, 1.0f); 
float random_value_1 = dist(rng); 
float random_value_2 = dist(rng); 

您可以在主机和设备代码中使用它。 看看Thrust examples