【发布时间】: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