在CUDA上乘以两个浮点变量

时间:2012-11-11 02:27:53

标签: c++ c cuda gpu multiplication

我有一个非常有趣的问题,但我解决了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次。

有人可以帮我吗?

1 个答案:

答案 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”。

你可以将浮动更改为双打吗?