2

我需要CUDA中的betapdf(x,a,b)Beta概率密度函数)函数吗?CUDA 有这个功能还是我应该自己实现它?

4

2 回答 2

2

好吧,我不知道 beta 函数,但是 CUDA 中有两个 gamma 函数变体,请参阅:CUDA Math API了解更多详细信息。

于 2013-03-01T14:21:24.440 回答
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] 中,请取消注释第一行。

编辑:如果您使用浮点数,请使用powfandtgammaf代替。

编辑 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 回答