提交 ef211924 authored 作者: Arnaud Bergeron's avatar Arnaud Bergeron

Make alpha and beta respect the type of the inputs.

上级 3a422ba3
...@@ -71,15 +71,33 @@ int APPLY_SPECIFIC(dnn_pool)(PyGpuArrayObject *img, ...@@ -71,15 +71,33 @@ int APPLY_SPECIFIC(dnn_pool)(PyGpuArrayObject *img,
return 1; return 1;
{ {
const float alpha = 1; const float alphaf = 1;
const float beta = 0; const float betaf = 0;
const double alphad = 1;
const double betad = 0;
void *alpha, *beta;
switch (img->ga.typecode) {
case GA_DOUBLE:
alpha = (void *)&alphad;
beta = (void *)&betad;
break;
case GA_FLOAT:
case GA_HALF:
alpha = (void *)&alphaf;
beta = (void *)&betaf;
break;
default:
PyErr_SetString(PyExc_TypeError, "Unsupported type in pooling");
return 1;
}
cuda_enter(c->ctx); cuda_enter(c->ctx);
err = cudnnPoolingForward( err = cudnnPoolingForward(
APPLY_SPECIFIC(_handle), desc, APPLY_SPECIFIC(_handle), desc,
&alpha, alpha,
APPLY_SPECIFIC(input), PyGpuArray_DEV_DATA(img), APPLY_SPECIFIC(input), PyGpuArray_DEV_DATA(img),
&beta, beta,
APPLY_SPECIFIC(output), PyGpuArray_DEV_DATA(*out)); APPLY_SPECIFIC(output), PyGpuArray_DEV_DATA(*out));
cuda_exit(c->ctx); cuda_exit(c->ctx);
} }
......
...@@ -63,7 +63,7 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp, ...@@ -63,7 +63,7 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp,
} }
if (!GpuArray_IS_C_CONTIGUOUS(&out_grad->ga)) { if (!GpuArray_IS_C_CONTIGUOUS(&out_grad->ga)) {
PyErr_SetString(PyExc_ValueError, "Only contiguous input gradients are supported."); PyErr_SetString(PyExc_ValueError, "Only contiguous output gradients are supported.");
return 1; return 1;
} }
...@@ -80,7 +80,7 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp, ...@@ -80,7 +80,7 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp,
return 1; return 1;
if (theano_prep_output(inp_grad, PyGpuArray_NDIM(inp), if (theano_prep_output(inp_grad, PyGpuArray_NDIM(inp),
PyGpuArray_DIMS(inp), out->ga.typecode, PyGpuArray_DIMS(inp), inp->ga.typecode,
GA_C_ORDER, pygpu_default_context()) != 0) { GA_C_ORDER, pygpu_default_context()) != 0) {
return 1; return 1;
} }
...@@ -89,17 +89,35 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp, ...@@ -89,17 +89,35 @@ int APPLY_SPECIFIC(dnn_pool_grad)(PyGpuArrayObject *inp,
return 1; return 1;
{ {
const float alpha = 1; const float alphaf = 1;
const float beta = 0; const float betaf = 0;
const double alphad = 1;
const double betad = 0;
void *alpha, *beta;
switch (inp->ga.typecode) {
case GA_DOUBLE:
alpha = (void *)&alphad;
beta = (void *)&betad;
break;
case GA_FLOAT:
case GA_HALF:
alpha = (void *)&alphaf;
beta = (void *)&betaf;
break;
default:
PyErr_SetString(PyExc_TypeError, "Unsupported type in pooling");
return 1;
}
cuda_enter(c->ctx); cuda_enter(c->ctx);
err = cudnnPoolingBackward( err = cudnnPoolingBackward(
APPLY_SPECIFIC(_handle), desc, APPLY_SPECIFIC(_handle), desc,
&alpha, alpha,
APPLY_SPECIFIC(output), PyGpuArray_DEV_DATA(out), APPLY_SPECIFIC(output), PyGpuArray_DEV_DATA(out),
APPLY_SPECIFIC(output_grad), PyGpuArray_DEV_DATA(out_grad), APPLY_SPECIFIC(output_grad), PyGpuArray_DEV_DATA(out_grad),
APPLY_SPECIFIC(input), PyGpuArray_DEV_DATA(inp), APPLY_SPECIFIC(input), PyGpuArray_DEV_DATA(inp),
&beta, beta,
APPLY_SPECIFIC(input_grad), PyGpuArray_DEV_DATA(*inp_grad) APPLY_SPECIFIC(input_grad), PyGpuArray_DEV_DATA(*inp_grad)
); );
cuda_exit(c->ctx); cuda_exit(c->ctx);
......
...@@ -50,18 +50,36 @@ int APPLY_SPECIFIC(softmax)(PyGpuArrayObject *x, ...@@ -50,18 +50,36 @@ int APPLY_SPECIFIC(softmax)(PyGpuArrayObject *x,
return 1; return 1;
{ {
const float alpha = 1.; const float alphaf = 1;
const float beta = 0.; const float betaf = 0;
const double alphad = 1;
const double betad = 0;
void *alpha, *beta;
switch (x->ga.typecode) {
case GA_DOUBLE:
alpha = (void *)&alphad;
beta = (void *)&betad;
break;
case GA_FLOAT:
case GA_HALF:
alpha = (void *)&alphaf;
beta = (void *)&betaf;
break;
default:
PyErr_SetString(PyExc_TypeError, "Unsupported type in pooling");
return 1;
}
cuda_enter(c->ctx); cuda_enter(c->ctx);
err = cudnnSoftmaxForward( err = cudnnSoftmaxForward(
APPLY_SPECIFIC(_handle), APPLY_SPECIFIC(_handle),
SOFTMAX_ALGO, SOFTMAX_ALGO,
SOFTMAX_MODE, SOFTMAX_MODE,
(void *)&alpha, alpha,
APPLY_SPECIFIC(input), APPLY_SPECIFIC(input),
PyGpuArray_DEV_DATA(x), PyGpuArray_DEV_DATA(x),
(void *)&beta, beta,
APPLY_SPECIFIC(output), APPLY_SPECIFIC(output),
PyGpuArray_DEV_DATA(*out) PyGpuArray_DEV_DATA(*out)
); );
......
...@@ -63,20 +63,38 @@ int APPLY_SPECIFIC(softmax_grad)(PyGpuArrayObject *dy, ...@@ -63,20 +63,38 @@ int APPLY_SPECIFIC(softmax_grad)(PyGpuArrayObject *dy,
return 1; return 1;
{ {
const float alpha = 1.; const float alphaf = 1;
const float beta = 0.; const float betaf = 0;
const double alphad = 1;
const double betad = 0;
void *alpha, *beta;
switch (sm->ga.typecode) {
case GA_DOUBLE:
alpha = (void *)&alphad;
beta = (void *)&betad;
break;
case GA_FLOAT:
case GA_HALF:
alpha = (void *)&alphaf;
beta = (void *)&betaf;
break;
default:
PyErr_SetString(PyExc_TypeError, "Unsupported type in pooling");
return 1;
}
cuda_enter(c->ctx); cuda_enter(c->ctx);
err = cudnnSoftmaxBackward( err = cudnnSoftmaxBackward(
APPLY_SPECIFIC(_handle), APPLY_SPECIFIC(_handle),
SOFTMAX_ALGO, SOFTMAX_ALGO,
SOFTMAX_MODE, SOFTMAX_MODE,
(void *)&alpha, alpha,
APPLY_SPECIFIC(sm), APPLY_SPECIFIC(sm),
PyGpuArray_DEV_DATA(sm), PyGpuArray_DEV_DATA(sm),
APPLY_SPECIFIC(dy), APPLY_SPECIFIC(dy),
PyGpuArray_DEV_DATA(dy), PyGpuArray_DEV_DATA(dy),
(void*) &beta, beta,
APPLY_SPECIFIC(out), APPLY_SPECIFIC(out),
PyGpuArray_DEV_DATA(*out) PyGpuArray_DEV_DATA(*out)
); );
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论