繁体   English   中英

从CUDA中的各种分布生成随机数

[英]Generating random numbers from various distributions in CUDA

我正在玩GPU上的MCMC,需要为CUDA编写各种采样器的实现。

我在StackOverflow上看到的大多数帖子都涉及统一,二项和正常采样。 是否有让我的dpqr功能在R上的简约和多样的所有库(见页)?

我希望能够从Gamma,Normal,Binomial和贝叶斯问题中使用的逆分布(逆卡方,反伽马)进行采样,并且不希望使用逆概率变换和接受拒绝来编写我自己的问题。采样。

对于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;
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM