提交 0c962794 authored 作者: Frederic's avatar Frederic 提交者: Arnaud Bergeron

Make dnn pooling compile again R2

上级 87640d7e
...@@ -710,14 +710,22 @@ class GpuDnnPoolDesc(GpuOp): ...@@ -710,14 +710,22 @@ class GpuDnnPoolDesc(GpuOp):
"descriptor: %%s", cudnnGetErrorString(err)); "descriptor: %%s", cudnnGetErrorString(err));
%(fail)s %(fail)s
} }
#ifndef CUDNN_VERSION
err = cudnnSetPoolingDescriptor( err = cudnnSetPoolingDescriptor(
%(desc)s, %(desc)s,
%(mode_flag)s, %(mode_flag)s,
%(wsX)d, %(wsY)d, %(wsX)d, %(wsY)d,
%(stridex)d, %(stridey)d %(stridex)d, %(stridey)d
); );
#else
err = cudnnSetPooling2dDescriptor(
%(desc)s,
%(mode_flag)s,
%(wsX)d, %(wsY)d,
0, 0,
%(stridex)d, %(stridey)d
);
#endif
if (err != CUDNN_STATUS_SUCCESS) { if (err != CUDNN_STATUS_SUCCESS) {
PyErr_Format(PyExc_RuntimeError, "could not set op descriptor: %%s", PyErr_Format(PyExc_RuntimeError, "could not set op descriptor: %%s",
cudnnGetErrorString(err)); cudnnGetErrorString(err));
...@@ -729,7 +737,7 @@ class GpuDnnPoolDesc(GpuOp): ...@@ -729,7 +737,7 @@ class GpuDnnPoolDesc(GpuOp):
stridey=self.stride[1]) stridey=self.stride[1])
def c_code_cache_version(self): def c_code_cache_version(self):
return (1,) return (1, version())
class GpuDnnPool(DnnBase): class GpuDnnPool(DnnBase):
...@@ -805,9 +813,19 @@ if (!CudaNdarray_is_c_contiguous(%(input)s)) { ...@@ -805,9 +813,19 @@ if (!CudaNdarray_is_c_contiguous(%(input)s)) {
%(set_in)s %(set_in)s
cudnnPoolingMode_t mode; cudnnPoolingMode_t mode;
int wsX, wsY, strideX, strideY; int wsX, wsY, vpad, hpad, strideX, strideY;
#ifndef CUDNN_VERSION
err%(name)s = cudnnGetPoolingDescriptor(%(desc)s, &mode, &wsX, &wsY, &strideX, &strideY); err%(name)s = cudnnGetPoolingDescriptor(
%(desc)s, &mode,
&wsX, &wsY,
&strideX, &strideY);
#else
err%(name)s = cudnnGetPooling2dDescriptor(
%(desc)s, &mode,
&wsX, &wsY,
&vpad, &hpad,
&strideX, &strideY);
#endif
if (err%(name)s != CUDNN_STATUS_SUCCESS) { if (err%(name)s != CUDNN_STATUS_SUCCESS) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,
...@@ -827,13 +845,27 @@ if (CudaNdarray_prep_output(&%(out)s, 4, %(out)s_dims) != 0) ...@@ -827,13 +845,27 @@ if (CudaNdarray_prep_output(&%(out)s, 4, %(out)s_dims) != 0)
} }
%(set_out)s %(set_out)s
#ifndef CUDNN_VERSION
err%(name)s = cudnnPoolingForward(
_handle,
%(desc)s,
%(input_desc)s, CudaNdarray_DEV_DATA(%(input)s),
%(output_desc)s, CudaNdarray_DEV_DATA(%(out)s)
);
#else
{
const float alpha = 1;
const float beta = 0;
err%(name)s = cudnnPoolingForward( err%(name)s = cudnnPoolingForward(
_handle, _handle,
%(desc)s, %(desc)s,
&alpha,
%(input_desc)s, CudaNdarray_DEV_DATA(%(input)s), %(input_desc)s, CudaNdarray_DEV_DATA(%(input)s),
&beta,
%(output_desc)s, CudaNdarray_DEV_DATA(%(out)s) %(output_desc)s, CudaNdarray_DEV_DATA(%(out)s)
); );
}
#endif
if (err%(name)s != CUDNN_STATUS_SUCCESS) { if (err%(name)s != CUDNN_STATUS_SUCCESS) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,
"GpuDnnPool: error doing cudnnPoolingForward operation: %%s", "GpuDnnPool: error doing cudnnPoolingForward operation: %%s",
...@@ -863,7 +895,7 @@ if (err%(name)s != CUDNN_STATUS_SUCCESS) { ...@@ -863,7 +895,7 @@ if (err%(name)s != CUDNN_STATUS_SUCCESS) {
return [[1], [0]] return [[1], [0]]
def c_code_cache_version(self): def c_code_cache_version(self):
return (4,) return (4, version())
class GpuDnnPoolGrad(DnnBase): class GpuDnnPoolGrad(DnnBase):
...@@ -995,15 +1027,31 @@ if (CudaNdarray_prep_output(&%(output_grad)s, 4, ...@@ -995,15 +1027,31 @@ if (CudaNdarray_prep_output(&%(output_grad)s, 4,
} }
%(set_out)s %(set_out)s
#ifndef CUDNN_VERSION
err%(name)s = cudnnPoolingBackward(
_handle,
%(desc)s,
%(input_desc)s, CudaNdarray_DEV_DATA(%(input)s),
%(input_grad_desc)s, CudaNdarray_DEV_DATA(%(input_grad)s),
%(output_desc)s, CudaNdarray_DEV_DATA(%(output)s),
%(output_grad_desc)s, CudaNdarray_DEV_DATA(%(output_grad)s)
);
#else
{
const float alpha = 1;
const float beta = 0;
err%(name)s = cudnnPoolingBackward( err%(name)s = cudnnPoolingBackward(
_handle, _handle,
%(desc)s, %(desc)s,
&alpha,
%(input_desc)s, CudaNdarray_DEV_DATA(%(input)s), %(input_desc)s, CudaNdarray_DEV_DATA(%(input)s),
%(input_grad_desc)s, CudaNdarray_DEV_DATA(%(input_grad)s), %(input_grad_desc)s, CudaNdarray_DEV_DATA(%(input_grad)s),
%(output_desc)s, CudaNdarray_DEV_DATA(%(output)s), %(output_desc)s, CudaNdarray_DEV_DATA(%(output)s),
&beta,
%(output_grad_desc)s, CudaNdarray_DEV_DATA(%(output_grad)s) %(output_grad_desc)s, CudaNdarray_DEV_DATA(%(output_grad)s)
); );
}
#endif
if (err%(name)s != CUDNN_STATUS_SUCCESS) { if (err%(name)s != CUDNN_STATUS_SUCCESS) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,
"GpuDnnPoolGrad: error doing operation: %%s", "GpuDnnPoolGrad: error doing operation: %%s",
...@@ -1020,7 +1068,7 @@ if (err%(name)s != CUDNN_STATUS_SUCCESS) { ...@@ -1020,7 +1068,7 @@ if (err%(name)s != CUDNN_STATUS_SUCCESS) {
output_grad_desc="output_grad"+name) output_grad_desc="output_grad"+name)
def c_code_cache_version(self): def c_code_cache_version(self):
return (4,) return (4, version())
def dnn_pool(img, ws, stride=(1, 1), mode='max'): def dnn_pool(img, ws, stride=(1, 1), mode='max'):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论