У меня действительно интересная проблема, но я решаю ее в течение 3 часов, и я просто не могу понять, что происходит и почему это не работает. Я попытался Google, но безрезультатно.
Я кодирую программу на 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 сообщает мне, что: «у« производного »нет значения в целевом местоположении»
Градиент * 2.0 работает правильно и меняет значение градиента 2 раза.
Кто-нибудь может мне помочь?
a = pow(euler, neuron_device[startIndex + idx].outputValue);
b = pow(euler, -neuron_device[startIndex + idx].outputValue);
derivation = pow((2/(a + b),2);
Пау выдает ошибку, когда:
Если база отрицательна а также показатель не является интегральной величиной, или если база равна нулю и показатель степени отрицательный, возникает ошибка домена, в которой для глобальной переменной errno установлено значение EDOM.
Я предполагаю, что вы получаете проблемы с точностью, и оба «a» и «b» равны 0. Возможно, вы получаете производное = 0 или «inf».
Можете ли вы изменить поплавки на двойные?
Других решений пока нет …