4

私は非常に興味深い問題を抱えていますが、それを 3 時間解決していますが、何が起こっているのか、なぜ機能していないのかわかりません。私はそれをグーグルで試しましたが、結果はありませんでした。

私はCUDAでプログラムをコーディングしています。私はこの本当に単純なコードを持っています:

__global__ void calcErrorOutputLayer_kernel(*arguments...*)
{

   int idx = blockIdx.x * blockDim.x + threadIdx.x;
   float gradient;
   float derivation;
   derivation = pow((2/(pow(euler, neuron_device[startIndex + idx].outputValue) +
                pow(euler, -neuron_device[startIndex + idx].outputValue))), 2);
   gradient = (backVector_device[idx] - neuron_device[startIndex + idx].outputValue);

   gradient = gradient * derivation;   //this line doesn't work   
   gradient = gradient * 2.0;          //this line works

わかりましたので、勾配は正しく計算され、導出も行われます。しかし、行が来ると、これら2つの変数が互いに乗算されるべきであり、何も起こらず(勾配の値は変更されません)、次の行でCUDAデバッガーは次のように伝えます:「「派生」はターゲット位置に値がありません」

勾配 * 2.0 は正しく機能し、勾配の値を 2 回変更します。

誰でも私を助けてもらえますか?

4

1 に答える 1

4
a = pow(euler, neuron_device[startIndex + idx].outputValue);
b = pow(euler, -neuron_device[startIndex + idx].outputValue);
derivation = pow((2/(a + b),2);

Pow は次の場合にエラーを出します:

  • 基数が負で、指数が整数値でない、または
  • 基数がゼロで指数がの場合、ドメイン エラーが発生し、グローバル変数 errno が値 EDOM に設定されます。

'a'あなたは精度の問題に直面していると思い'b'ます0。あなたはおそらくderivation = 0またはを取得してい"inf"ます。

float を double に変更できますか?

于 2012-11-11T03:30:07.993 に答える