2013-05-21 32 views
1

我在GPU上玩MCMC,需要針對CUDA編寫的各種採樣器的實現。從CUDA的各種發行版中生成隨機數

我在StackOverflow上看到的大多數帖子都涉及到統一,二項和正常採樣。是否有任何庫允許R中的d-p-q-r函數的簡單性和多樣性(請參閱this頁)?

我希望能夠從伽瑪,正態,二項式以及用於貝葉斯問題(逆卡方,逆伽馬)的逆分佈中採樣,並且寧願不必使用逆概率變換來編寫我自己的和接受拒絕抽樣。

+1

AFAIK,沒有這樣的庫。 [Thrust](http://thrust.github.io/doc/group__random.html)或[cuRAND](https://developer.nvidia.com/curand)支持通常的發行版,但您可能需要製作自己的發行版內核爲異國情調的。如果你找不到任何圖書館,這可能不太難實施,甚至可以集成到其他圖書館(特別是Thrust,它可以很容易地在Github上分發)。 – BenC

回答

3

對於Gamma分佈,這是我目前使用的。 GSL功能修改爲與CuRAND一起使用。

__device__ double ran_gamma (curandState localState, const double a, const double b){ 
/* assume a > 0 */ 

if (a < 1){ 
    double u = curand_uniform_double(&localState); 
    return ran_gamma (localState, 1.0 + a, b) * pow (u, 1.0/a); 
} 

{ 
    double x, v, u; 
    double d = a - 1.0/3.0; 
    double c = (1.0/3.0)/sqrt (d); 

    while (1){ 
     do{ 
      x = curand_normal_double(&localState); 
      v = 1.0 + c * x; 
     } while (v <= 0); 

     v = v * v * v; 
     u = curand_uniform_double(&localState); 

     if (u < 1 - 0.0331 * x * x * x * x) 
      break; 

     if (log (u) < 0.5 * x * x + d * (1 - v + log (v))) 
      break; 
    } 
    return b * d * v; 
} 
}