我在CUDA中需要betapdf(x,a,b)
(Beta probability density function)函数吗?是否有CUDA的这个功能,或者我自己应该实现它?
答案 0 :(得分:2)
我不了解beta函数,但CUDA中有两种gamma函数变体,有关详细信息,请参阅:CUDA Math API。
答案 1 :(得分: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]中,则取消注释第一行。
编辑:如果您使用的是浮点数,请改用powf
和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;
}