CUDA でbetapdf(x,a,b)
(ベータ確率密度関数) 関数のようなものが必要ですか? CUDA用のこの機能はありますか、それとも自分で実装する必要がありますか?
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 を使用している場合は、代わりにpowf
andを使用してください。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 に答える