1

我在 3.0 计算能力上使用 C for CUDA,并且必须使用内置的双精度对数函数。我发现为此我应该使用double log(double x)函数(文档)。但是,如果我在双精度范围内传递一个非常小的数字(例如double x = 6.73E-42), log(x)函数返回-Infinity. 在 JavaMath.log()函数中返回相同的值-94.802。这是 CUDA 数学库中的错误还是我有什么问题?

编辑:这是我在内核函数中使用的代码

#include "math.h"
extern "C"
__global__ void smallLog(double* in, int n)
{
   int i = blockIdx.x * blockDim.x + threadIdx.x;
   if (i<n){
      double x = in[i];
      in[i] = log(x);
   }
}
4

2 回答 2

3

确保您正在为计算能力 3.0 ( nvcc -arch sm_30) 进行编译。

默认情况下,nvcc 编译为计算能力 1.0,它仅是单精度并且(正如其他人已经指出的那样)6.73E-42 在单精度和 log(0) = -Infinity 中为零。

于 2012-09-11T09:41:19.443 回答
0

对于您的问题,答案应该是-94.802。

尝试拆分log(6.73E-42)

log(6.731E-20) + log(1E-22) = [(-44.145)+(-50.66)]=(-94.802)

或者,如果你愿意,你可以分成更多的部分,最后添加。抱歉,我的设备不支持双精度。这是我能给出的答案。

于 2012-09-09T13:34:33.123 回答