用于CUDA的beta pdf函数

时间:2013-03-01 12:54:11

标签: cuda statistics

我在CUDA中需要betapdf(x,a,b)Beta probability density function)函数吗?是否有CUDA的这个功能,或者我自己应该实现它?

2 个答案:

答案 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]中,则取消注释第一行。

编辑:如果您使用的是浮点数,请改用powftgammaf

编辑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;
}