用于CUDA的beta pdf功能



我需要betapdf(x,a,b) ( β概率密度函数)函数在CUDA?有这个功能的CUDA或我应该实现它自己?

这是一个可以在主机和设备上使用的函数。在主机上,您需要包含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,请使用powftgammaf代替。

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

嗯,我不知道beta函数,但是在CUDA中有两种变体的gamma函数,详见:CUDA Math API

最新更新