我有一个非常有趣的问题,但我解决了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次。
有人可以帮我吗?
答案 0 :(得分:4)
a = pow(euler, neuron_device[startIndex + idx].outputValue);
b = pow(euler, -neuron_device[startIndex + idx].outputValue);
derivation = pow((2/(a + b),2);
Pow在以下情况下出错: 如果 base为负且指数不是整数值,或 base为零且指数为负 ,发生域错误,将全局变量errno设置为值EDOM。
我的猜测是你得到精确度问题,'a'和'b'都是0.你可能得到推导= 0或“inf”。
你可以将浮动更改为双打吗?