2

CUDA でbetapdf(x,a,b)(ベータ確率密度関数) 関数のようなものが必要ですか? CUDA用のこの機能はありますか、それとも自分で実装する必要がありますか?

4

2 に答える 2

2

これは、ホストとデバイスの両方で使用できる機能です。ホストでは、math.h を含める必要があります。

__host__ __device__ 
double betapdf(double x, double a, double b)
{
   //if (x < 0 || x > 1) return 0;
   double tmp = pow((1 - x), (b - 1)) * pow(x, (a - 1));
   double iB = tgamma(a + b) / (tgamma(a) * tgamma(b));  // 1/B
   return tmp * iB;
}

x が [0 1] にあることがわからない場合は、最初の行のコメントを外してください。

EDIT : float を使用している場合は、代わりにpowfandを使用してください。tgammaf

編集 2コメントで言及されている @njuffa のように、この特定のコードは中間オーバーフローの問題に悩まされる可能性があります。その場合は、次の方法が適している可能性があります。

__host__ __device__ 
double betapdf2(double x, double a, double b)
{
   //if (x < 0 || x > 1) return 0;
   double tmp = pow((1 - x), (b - 1)) * pow(x, (a - 1));
   double iB = exp(lgamma(a + b) - lgamma(a) - lgamma(b)); // 1/B
   return tmp * iB;
}
于 2013-03-01T15:56:38.090 に答える
2

ベータ関数についてはわかりませんが、CUDA にはガンマ関数の 2 つのバリアントがあります。詳細については、 CUDA Math APIを参照してください。

于 2013-03-01T14:21:24.440 に答える