1

私は 3.0 コンピューティング機能で CUDA に C を使用しており、倍精度の組み込み対数関数を使用する必要があります。そのためにはdouble log(double x)関数(documentation)を使用する必要があることがわかりました。しかし、倍精度スコープ内で非常に小さな数値を渡すと (例: 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 に答える