2013-05-21 2 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)는 일반적인 배포판을 지원하지만 직접 작성해야 할 수도 있습니다 이국적인 것들을위한 커널. 라이브러리를 찾을 수 없다면, 구현하기가 그리 어렵지 않고 다른 라이브러리 (특히 Github에서 쉽게 돌릴 수있는 Thrust)에 통합 될 수도 있습니다. – BenC

답변

3

감마 분포의 경우, 지금 내가 사용하는 것입니다. CuRAND와 함께 작동하도록 수정 된 GSL 기능입니다.

__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; 
} 
}