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

好的,所以梯度计算正确并且推导也正确。但是当上线时,这两个变量应该在哪里相乘什么都没有发生(梯度的值没有改变)并且在下一行 CUDA 调试器告诉我:“'派生'在目标位置没有价值”

gradient * 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"

你能把花车改成双打吗?

于 2012-11-11T03:30:07.993 回答