【问题标题】:cuda double precision logarithm errorcuda 双精度对数误差
【发布时间】:2012-09-11 17:41:19
【问题描述】:

我在 3.0 计算能力上使用 C for CUDA 并且必须使用 内置双精度对数函数。我发现对于 为此,我应该使用double log(double x) 函数(documentation)。 但是,如果我在双精度范围内传递一个非常小的数字 (例如double x = 6.73E-42), log(x) 函数返回 -Infinity。在 Java 中 Math.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);
   }
}

【问题讨论】:

  • CUDA 可能正在使用floats 进行计算。那么 6.73E-42 为 0。
  • 可以通过查看SM版本来判断硬件是否支持double:cudaDeviceProp的主要/次要成员,或者cuDeviceComputeCapability()。仅 SM 1.3 及更高版本的硬件支持双精度
  • 我有一台 GeForce GTX 680,计算能力为 3.0。它应该支持双精度计算。

标签: math cuda logarithm double-precision


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    尝试将log(6.73E-42)拆分成

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多