I can't reproduce your problem using a simple convolution in float16.

Either this is because your code is doing something unexpected or because
the problem has been fixed in the development version.

In nay case the development version is a much better option for the new
backend and float16 so I encourage you to upgrade and try again:
http://deeplearning.net/software/theano/install.html#bleeding-edge-install-instructions
.

2016-07-14 4:22 GMT-04:00 <[email protected]>:

> Here is .theanorc:
>
> [global]
> floatX = float16
> device=cuda
> [cuda]
> root = /usr/local/cuda-7.5
>
>
> [nvcc]
> fastmath=True
>
> optimizer = fast_compile
>
> On Thursday, July 14, 2016 at 10:19:56 AM UTC+2, [email protected]
> wrote:
>>
>> Hi Arnaud,
>> I put _f16_ok = True in dnn.py ( attached).
>>
>> This is the error I received:
>>
>> Python 2.7.11 |Anaconda custom (64-bit)| (default, Dec  6 2015, 18:08:32)
>> [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
>> Type "help", "copyright", "credits" or "license" for more information.
>> Anaconda is brought to you by Continuum Analytics.
>> Please check out: http://continuum.io/thanks and https://anaconda.org
>> >>> import run_multi_conv
>>
>> Mapped name None to device cuda: GeForce 840M
>> WARNING (theano.gof.compilelock): Overriding existing lock by dead
>> process '3202' (I am process '3351')
>> Using cuDNN version 5005 on context None
>> /home/luca/data/Theano-master/theano/tensor/signal/downsample.py:6:
>> UserWarning: downsample module has been moved to the
>> theano.tensor.signal.pool module.
>>   "downsample module has been moved to the theano.tensor.signal.pool
>> module.")
>> >>>
>> >>> run_multi_conv.run_experiments()
>> Disabling C code for Elemwise{mul,no_inplace} due to unsupported float16
>> Disabling C code for Elemwise{Cast{float32}} due to unsupported float16
>> Disabling C code for Elemwise{Cast{float16}} due to unsupported float16
>> Disabling C code for Elemwise{Cast{float16}} due to unsupported float16
>> Disabling C code for Alloc due to unsupported float16
>> Disabling C code for Cast{float16} due to unsupported float16
>> Disabling C code for Cast{float16} due to unsupported float16
>> Disabling C code for Cast{float16} due to unsupported float16
>> Disabling C code for Cast{float16} due to unsupported float16
>> Disabling C code for RandomFunction{binomial} due to unsupported float16
>> Disabling C code for RandomFunction{binomial} due to unsupported float16
>> ===============================
>> 00001    #include <Python.h>
>> 00002    #include <iostream>
>> 00003    #include "theano_mod_helper.h"
>> 00004    #include <gpuarray/array.h>
>> 00005    #include <gpuarray/kernel.h>
>> 00006    #include <gpuarray/error.h>
>> 00007    #include <gpuarray/buffer.h>
>> 00008    #include <gpuarray/buffer_blas.h>
>> 00009    #include <numpy/arrayobject.h>
>> 00010    #include <gpuarray_api.h>
>> 00011    #include <math.h>
>> 00012    #include <numpy/arrayscalars.h>
>> 00013    #include "cudnn.h"
>> 00014    #include "cudnn_helper.h"
>> 00015    #include "gpuarray_helper.h"
>> 00016    #include "gpuarray/types.h"
>> 00017    #include "gpuarray/array.h"
>> 00018    #include "gpuarray/util.h"
>> 00019    #include "gpuarray/ext_cuda.h"
>> 00020    #include "gpuarray_api.h"
>> 00021    #include "numpy_compat.h"
>> 00022    //////////////////////
>> 00023    ////  Support Code
>> 00024    //////////////////////
>> 00025
>> 00026
>> 00027
>> 00028    static int
>> 00029    c_set_tensorNd(PyGpuArrayObject *var, cudnnTensorDescriptor_t
>> desc) {
>> 00030      cudnnDataType_t dt;
>> 00031      size_t ds;
>> 00032      switch (var->ga.typecode) {
>> 00033      case GA_FLOAT:
>> 00034        dt = CUDNN_DATA_FLOAT;
>> 00035        break;
>> 00036      case GA_DOUBLE:
>> 00037        dt = CUDNN_DATA_DOUBLE;
>> 00038        break;
>> 00039    #if CUDNN_VERSION > 3000
>> 00040      case GA_HALF:
>> 00041        dt = CUDNN_DATA_HALF;
>> 00042        break;
>> 00043    #endif
>> 00044      default:
>> 00045        PyErr_SetString(PyExc_TypeError, "Non-float datatype in
>> c_set_tensorNd");
>> 00046        return -1;
>> 00047      }
>> 00048      ds = gpuarray_get_elsize(var->ga.typecode);
>> 00049
>> 00050      int strs[5], dims[5], default_stride = 1;
>> 00051      unsigned int nd = PyGpuArray_NDIM(var);
>> 00052
>> 00053      if (nd > 5) {
>> 00054        PyErr_SetString(PyExc_TypeError, "Tensor of more than 5d");
>> 00055        return -1;
>> 00056      }
>> 00057
>> 00058      for (unsigned int _i = nd; _i > 0; _i--) {
>> 00059        unsigned int i = _i - 1;
>> 00060        strs[i] = PyGpuArray_STRIDE(var, i) ?
>> 00061          PyGpuArray_STRIDE(var, i)/ds : default_stride;
>> 00062        default_stride *= PyGpuArray_DIM(var, i);
>> 00063        dims[i] = PyGpuArray_DIM(var, i);
>> 00064      }
>> 00065
>> 00066      cudnnStatus_t err = cudnnSetTensorNdDescriptor(desc, dt, nd,
>> dims, strs);
>> 00067      if (err != CUDNN_STATUS_SUCCESS) {
>> 00068        PyErr_Format(PyExc_RuntimeError,
>> 00069             "Could not set tensorNd descriptor: %s",
>> 00070             cudnnGetErrorString(err));
>> 00071        return -1;
>> 00072      }
>> 00073      return 0;
>> 00074    }
>> 00075
>> 00076    static int
>> 00077    c_set_filter(PyGpuArrayObject *var, cudnnFilterDescriptor_t
>> desc) {
>> 00078      cudnnDataType_t dt;
>> 00079      cudnnStatus_t err;
>> 00080
>> 00081      if (!GpuArray_IS_C_CONTIGUOUS(&var->ga)) {
>> 00082        PyErr_SetString(PyExc_ValueError,
>> 00083                "Only contiguous filters (kernels) are supported.");
>> 00084        return -1;
>> 00085      }
>> 00086      switch (var->ga.typecode) {
>> 00087      case GA_FLOAT:
>> 00088        dt = CUDNN_DATA_FLOAT;
>> 00089        break;
>> 00090      case GA_DOUBLE:
>> 00091        dt = CUDNN_DATA_DOUBLE;
>> 00092        break;
>> 00093    #if CUDNN_VERSION > 3000
>> 00094      case GA_HALF:
>> 00095        dt = CUDNN_DATA_HALF;
>> 00096        break;
>> 00097    #endif
>> 00098      default:
>> 00099        PyErr_SetString(PyExc_TypeError, "Non-float datatype in
>> c_set_filter");
>> 00100        return -1;
>> 00101      }
>> 00102
>> 00103      int dims[5];
>> 00104      unsigned int nd = PyGpuArray_NDIM(var);
>> 00105
>> 00106      if (nd > 5) {
>> 00107        PyErr_SetString(PyExc_TypeError, "Tensor of more than 5d");
>> 00108        return -1;
>> 00109      }
>> 00110
>> 00111      for (unsigned int _i = nd; _i > 0; _i--) {
>> 00112        unsigned int i = _i - 1;
>> 00113        dims[i] = PyGpuArray_DIM(var, i);
>> 00114      }
>> 00115
>> 00116    #if CUDNN_VERSION >= 5000
>> 00117        err = cudnnSetFilterNdDescriptor(desc, dt,
>> CUDNN_TENSOR_NCHW, nd, dims);
>> 00118    #else
>> 00119        err = cudnnSetFilterNdDescriptor(desc, dt, nd, dims);
>> 00120    #endif
>> 00121
>> 00122      if (err != CUDNN_STATUS_SUCCESS) {
>> 00123        PyErr_Format(PyExc_RuntimeError,
>> 00124             "Could not set filter descriptor: %s.",
>> 00125             cudnnGetErrorString(err));
>> 00126        return -1;
>> 00127      }
>> 00128      return 0;
>> 00129    }
>> 00130
>> 00131
>> 00132
>> 00133        namespace {
>> 00134        struct __struct_compiled_op_86feacd077d8749f42b5d82709a80ba3
>> {
>> 00135            PyObject* __ERROR;
>> 00136
>> 00137            PyObject* storage_V3;
>> 00138    PyObject* storage_V5;
>> 00139    PyObject* storage_V7;
>> 00140    PyObject* storage_V9;
>> 00141    PyObject* storage_V11;
>> 00142    PyObject* storage_V13;
>> 00143    PyObject* storage_V1;
>> 00144    PyObject* storage_V15;
>> 00145
>> 00146        PyObject* py_V15;
>> 00147        PyGpuContextObject *V15;
>> 00148    #define DTYPE_INPUT_0 npy_float16
>> 00149    #define TYPENUM_INPUT_0 23
>> 00150    #define ITEMSIZE_INPUT_0 2
>> 00151    #define DTYPE_INPUT_1 npy_float16
>> 00152    #define TYPENUM_INPUT_1 23
>> 00153    #define ITEMSIZE_INPUT_1 2
>> 00154    #define DTYPE_INPUT_2 npy_float16
>> 00155    #define TYPENUM_INPUT_2 23
>> 00156    #define ITEMSIZE_INPUT_2 2
>> 00157    #define DTYPE_INPUT_4 npy_float16
>> 00158    #define TYPENUM_INPUT_4 23
>> 00159    #define ITEMSIZE_INPUT_4 2
>> 00160    #define DTYPE_INPUT_5 npy_float16
>> 00161    #define TYPENUM_INPUT_5 23
>> 00162    #define ITEMSIZE_INPUT_5 2
>> 00163    #define DTYPE_OUTPUT_0 npy_float16
>> 00164    #define TYPENUM_OUTPUT_0 23
>> 00165    #define ITEMSIZE_OUTPUT_0 2
>> 00166    #define APPLY_SPECIFIC(str)
>> str##_node_86feacd077d8749f42b5d82709a80ba3_0
>> 00167    #define CONV_INPLACE 1
>> 00168    #define CONV_ALGO
>> CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM
>> 00169
>> 00170
>> 00171    PyGpuContextObject *ctx;
>> 00172    cudnnHandle_t APPLY_SPECIFIC(_handle);
>> 00173
>> 00174
>> 00175    cudnnTensorDescriptor_t APPLY_SPECIFIC(input);
>> 00176    cudnnTensorDescriptor_t APPLY_SPECIFIC(output);
>> 00177    cudnnFilterDescriptor_t APPLY_SPECIFIC(kerns);
>> 00178
>> 00179
>> 00180
>> 00181    #ifdef CHOOSE_ALGO
>> 00182    int reuse_algo;
>> 00183    cudnnConvolutionFwdAlgo_t prev_algo;
>> 00184    #ifndef CHOOSE_ONCE
>> 00185    size_t prev_img_dims[5];
>> 00186    size_t prev_kern_dims[5];
>> 00187    #endif
>> 00188    #endif
>> 00189
>> 00190    int
>> 00191    APPLY_SPECIFIC(conv_fwd)(PyGpuArrayObject *input,
>> PyGpuArrayObject *kerns,
>> 00192                             PyGpuArrayObject *om,
>> 00193                             cudnnConvolutionDescriptor_t desc,
>> 00194                             double alpha, double beta,
>> 00195                             PyGpuArrayObject **output,
>> 00196                             PyGpuContextObject *c) {
>> 00197      cudnnStatus_t err = CUDNN_STATUS_SUCCESS;
>> 00198      float af = alpha, bf = beta;
>> 00199      void *alpha_p;
>> 00200      void *beta_p;
>> 00201
>> 00202      if (PyGpuArray_DIMS(input)[1] != PyGpuArray_DIMS(kerns)[1]) {
>> 00203        PyErr_SetString(PyExc_ValueError,
>> 00204                "images and kernel must have the same stack size");
>> 00205        return 1;
>> 00206      }
>> 00207
>> 00208      if (c_set_tensorNd(input, APPLY_SPECIFIC(input)) == -1)
>> 00209        return 1;
>> 00210      if (c_set_filter(kerns, APPLY_SPECIFIC(kerns)) == -1)
>> 00211        return 1;
>> 00212
>> 00213      switch (input->ga.typecode) {
>> 00214      case GA_DOUBLE:
>> 00215        alpha_p = (void *)&alpha;
>> 00216        beta_p = (void *)&beta;
>> 00217        break;
>> 00218      case GA_FLOAT:
>> 00219      case GA_HALF:
>> 00220        alpha_p = (void *)&af;
>> 00221        beta_p = (void *)&bf;
>> 00222        break;
>> 00223      default:
>> 00224        PyErr_SetString(PyExc_TypeError, "Unsupported type in
>> convolution");
>> 00225        return 1;
>> 00226      }
>> 00227
>> 00228    #ifdef CONV_INPLACE
>> 00229      Py_XDECREF(*output);
>> 00230      *output = om;
>> 00231      Py_INCREF(*output);
>> 00232    #else
>> 00233      if (theano_prep_output(output, PyGpuArray_NDIM(om),
>> PyGpuArray_DIMS(om),
>> 00234                             om->ga.typecode, GA_C_ORDER, c) != 0)
>> 00235        return 1;
>> 00236      if (beta != 0.0 && pygpu_move(*output, om))
>> 00237        return 1;
>> 00238    #endif
>> 00239
>> 00240      if (c_set_tensorNd(*output, APPLY_SPECIFIC(output)) == -1)
>> 00241        return 1;
>> 00242
>> 00243      cudnnConvolutionFwdAlgo_t algo = CONV_ALGO;
>> 00244
>> 00245      cuda_enter(c->ctx);
>> 00246    #ifdef CHOOSE_ALGO
>> 00247    #ifndef CHOOSE_ONCE
>> 00248      reuse_algo = 1;
>> 00249      for (unsigned int i = 0; i < PyGpuArray_NDIM(input); i++) {
>> 00250        reuse_algo = (reuse_algo &&
>> 00251                      PyGpuArray_DIM(input, i) == prev_img_dims[i]);
>> 00252        reuse_algo = (reuse_algo &&
>> 00253                      PyGpuArray_DIM(kerns, i) == prev_kern_dims[i]);
>> 00254      }
>> 00255    #endif
>> 00256
>> 00257      if (!reuse_algo) {
>> 00258    #ifdef CHOOSE_TIME
>> 00259        int count;
>> 00260        cudnnConvolutionFwdAlgoPerf_t choice;
>> 00261        err = cudnnFindConvolutionForwardAlgorithm(
>> 00262          APPLY_SPECIFIC(_handle), APPLY_SPECIFIC(input),
>> APPLY_SPECIFIC(kerns),
>> 00263          desc, APPLY_SPECIFIC(output), 1, &count, &choice);
>> 00264
>> 00265        if (err != CUDNN_STATUS_SUCCESS) {
>> 00266          PyErr_Format(PyExc_RuntimeError,
>> 00267                       "error selecting convolution algo: %s",
>> 00268                       cudnnGetErrorString(err));
>> 00269          cuda_exit(c->ctx);
>> 00270          return 1;
>> 00271        }
>> 00272        algo = choice.algo;
>> 00273    #else
>> 00274        size_t free;
>> 00275        int err2 = gpucontext_property(c->ctx,
>> GA_CTX_PROP_FREE_GMEM, &free);
>> 00276
>> 00277        if (err2 != GA_NO_ERROR) {
>> 00278          PyErr_Format(PyExc_RuntimeError, "Error when trying to
>> find the "
>> 00279                       "memory information on the GPU");
>> 00280          cuda_exit(c->ctx);
>> 00281          return 1;
>> 00282        }
>> 00283
>> 00284        err = cudnnGetConvolutionForwardAlgorithm(
>> 00285          APPLY_SPECIFIC(_handle), APPLY_SPECIFIC(input),
>> APPLY_SPECIFIC(kerns),
>> 00286          desc, APPLY_SPECIFIC(output),
>> 00287          CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT, free,
>> &algo);
>> 00288        if (err != CUDNN_STATUS_SUCCESS) {
>> 00289          PyErr_Format(PyExc_RuntimeError,
>> 00290                       "error selecting convolution algo: %s",
>> 00291                       cudnnGetErrorString(err));
>> 00292          cuda_exit(c->ctx);
>> 00293          return 1;
>> 00294        }
>> 00295    #endif
>> 00296        prev_algo = algo;
>> 00297      } else {
>> 00298        algo = prev_algo;
>> 00299      }
>> 00300
>> 00301    #ifdef CHOOSE_ONCE
>> 00302      reuse_algo = 1;
>> 00303    #else
>> 00304      for (unsigned int i = 0; i < PyGpuArray_NDIM(input); i++) {
>> 00305        prev_img_dims[i] = PyGpuArray_DIM(input, i);
>> 00306        prev_kern_dims[i] = PyGpuArray_DIM(kerns, i);
>> 00307      }
>> 00308    #endif
>> 00309
>> 00310    #endif
>> 00311
>> 00312      /* These two algos are not supported for 3d conv */
>> 00313      if (PyGpuArray_NDIM(input) == 5 &&
>> 00314          (algo == CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM
>> ||
>> 00315           algo == CUDNN_CONVOLUTION_FWD_ALGO_GEMM))
>> 00316        algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM;
>> 00317
>> 00318      // The FFT implementation does not support strides, 1x1
>> filters or inputs
>> 00319      // with a spatial dimension larger than 1024. The tiled-FFT
>> implementation
>> 00320      // does not support strides.
>> 00321      // If the chosen implementation is FFT or tiled-FFT, validate
>> that it can
>> 00322      // be used on the current data and default to a safe
>> implementation if it
>> 00323      // can't.
>> 00324      // The following code is 2d-specific but it is fine as FFT and
>> tiled-FFT are
>> 00325      // defined only for 2d filters
>> 00326      if ((algo == CUDNN_CONVOLUTION_FWD_ALGO_FFT ||
>> 00327           algo == CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING) &&
>> PyGpuArray_NDIM(input) == 4) {
>> 00328
>> 00329        // Extract the properties of the convolution descriptor
>> 00330        int nd;
>> 00331        int pad[2];
>> 00332        int stride[2];
>> 00333        int upscale[2];
>> 00334        cudnnConvolutionMode_t mode;
>> 00335        cudnnDataType_t data_type;
>> 00336        err = cudnnGetConvolutionNdDescriptor(desc, 2, &nd, pad,
>> stride,
>> 00337                                                 upscale, &mode,
>> &data_type);
>> 00338        if (err != CUDNN_STATUS_SUCCESS) {
>> 00339          PyErr_Format(PyExc_RuntimeError,
>> 00340                       "error getting convolution properties: %s",
>> 00341                       cudnnGetErrorString(err));
>> 00342          cuda_exit(c->ctx);
>> 00343          return 1;
>> 00344        }
>> 00345
>> 00346        if (algo == CUDNN_CONVOLUTION_FWD_ALGO_FFT)
>> 00347        {
>> 00348          if (stride[0] != 1 || stride[1] != 1 ||
>> 00349              PyGpuArray_DIM(input, 2) > 1024 ||
>> PyGpuArray_DIM(input, 3) > 1024 ||
>> 00350              (PyGpuArray_DIM(kerns, 2) == 1 &&
>> PyGpuArray_DIM(kerns, 3) == 1))
>> 00351          {
>> 00352            algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM;
>> 00353          }
>> 00354        }
>> 00355        else
>> 00356        {
>> 00357          // algo == CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING
>> 00358          if (stride[0] != 1 || stride[1] != 1)
>> 00359          {
>> 00360            algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM;
>> 00361          }
>> 00362        }
>> 00363      }
>> 00364
>> 00365      {
>> 00366        size_t worksize;
>> 00367        gpudata *workspace;
>> 00368        err =
>> cudnnGetConvolutionForwardWorkspaceSize(APPLY_SPECIFIC(_handle),
>> 00369
>> APPLY_SPECIFIC(input),
>> 00370
>> APPLY_SPECIFIC(kerns),
>> 00371                                                      desc,
>> 00372
>> APPLY_SPECIFIC(output),
>> 00373                                                      algo,
>> 00374                                                      &worksize);
>> 00375
>> 00376        if (err == CUDNN_STATUS_NOT_SUPPORTED) {
>> 00377          // Fallback to none algo if not supported
>> 00378          // TODO: Print a warning
>> 00379          algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM;
>> 00380
>> 00381          err =
>> cudnnGetConvolutionForwardWorkspaceSize(APPLY_SPECIFIC(_handle),
>> 00382
>> APPLY_SPECIFIC(input),
>> 00383
>> APPLY_SPECIFIC(kerns),
>> 00384                                                        desc,
>> 00385
>> APPLY_SPECIFIC(output),
>> 00386                                                        algo,
>> 00387                                                        &worksize);
>> 00388        }
>> 00389
>> 00390        if (err != CUDNN_STATUS_SUCCESS) {
>> 00391          PyErr_Format(PyExc_RuntimeError,
>> 00392                       "error getting worksize: %s",
>> 00393                       cudnnGetErrorString(err));
>> 00394          cuda_exit(c->ctx);
>> 00395          return 1;
>> 00396        }
>> 00397
>> 00398        /*
>> 00399         * This is less than ideal since we need to free it after
>> (which
>> 00400         * introduces a synchronization point. But we don't have a
>> module
>> 00401         * to place a nice get_work_mem() function in.
>> 00402         */
>> 00403        if (worksize != 0) {
>> 00404          workspace = gpudata_alloc(c->ctx, worksize, NULL, 0, NULL);
>> 00405          if (workspace == NULL) {
>> 00406            PyErr_SetString(PyExc_RuntimeError,
>> 00407                            "Could not allocate working memory");
>> 00408            cuda_exit(c->ctx);
>> 00409            return 1;
>> 00410          }
>> 00411        }
>> 00412
>> 00413        cuda_wait(input->ga.data, GPUARRAY_CUDA_WAIT_READ);
>> 00414        cuda_wait(kerns->ga.data, GPUARRAY_CUDA_WAIT_READ);
>> 00415        cuda_wait((*output)->ga.data, GPUARRAY_CUDA_WAIT_WRITE);
>> 00416
>> 00417        err = cudnnConvolutionForward(
>> 00418          APPLY_SPECIFIC(_handle),
>> 00419          alpha_p,
>> 00420          APPLY_SPECIFIC(input), PyGpuArray_DEV_DATA(input),
>> 00421          APPLY_SPECIFIC(kerns), PyGpuArray_DEV_DATA(kerns),
>> 00422          desc, algo,
>> 00423          worksize == 0 ? NULL : *(void **)workspace, worksize,
>> 00424          beta_p,
>> 00425          APPLY_SPECIFIC(output), PyGpuArray_DEV_DATA(*output));
>> 00426
>> 00427        if (worksize != 0)
>> 00428          gpudata_release(workspace);
>> 00429
>> 00430        cuda_record(input->ga.data, GPUARRAY_CUDA_WAIT_READ);
>> 00431        cuda_record(kerns->ga.data, GPUARRAY_CUDA_WAIT_READ);
>> 00432        cuda_record((*output)->ga.data, GPUARRAY_CUDA_WAIT_WRITE);
>> 00433      }
>> 00434      cuda_exit(c->ctx);
>> 00435
>> 00436      if (err != CUDNN_STATUS_SUCCESS) {
>> 00437        PyErr_Format(PyExc_RuntimeError, "error doing operation: %s",
>> 00438             cudnnGetErrorString(err));
>> 00439        return 1;
>> 00440      }
>> 00441      return 0;
>> 00442    }
>> 00443
>> 00444    #undef DTYPE_INPUT_0
>> 00445    #undef TYPENUM_INPUT_0
>> 00446    #undef ITEMSIZE_INPUT_0
>> 00447    #undef DTYPE_INPUT_1
>> 00448    #undef TYPENUM_INPUT_1
>> 00449    #undef ITEMSIZE_INPUT_1
>> 00450    #undef DTYPE_INPUT_2
>> 00451    #undef TYPENUM_INPUT_2
>> 00452    #undef ITEMSIZE_INPUT_2
>> 00453    #undef DTYPE_INPUT_4
>> 00454    #undef TYPENUM_INPUT_4
>> 00455    #undef ITEMSIZE_INPUT_4
>> 00456    #undef DTYPE_INPUT_5
>> 00457    #undef TYPENUM_INPUT_5
>> 00458    #undef ITEMSIZE_INPUT_5
>> 00459    #undef DTYPE_OUTPUT_0
>> 00460    #undef TYPENUM_OUTPUT_0
>> 00461    #undef ITEMSIZE_OUTPUT_0
>> 00462    #undef APPLY_SPECIFIC
>> 00463    #undef CONV_INPLACE
>> 00464    #undef CONV_ALGO
>> 00465
>> 00466            __struct_compiled_op_86feacd077d8749f42b5d82709a80ba3() {
>> 00467                // This is only somewhat safe because we:
>> 00468                //  1) Are not a virtual class
>> 00469                //  2) Do not use any virtual classes in the members
>> 00470                //  3) Deal with mostly POD and pointers
>> 00471
>> 00472                // If this changes, we would have to revise this,
>> but for
>> 00473                // now I am tired of chasing segfaults because
>> 00474                // initialization code had an error and some pointer
>> has
>> 00475                // a junk value.
>> 00476                memset(this, 0, sizeof(*this));
>> 00477            }
>> 00478
>> ~__struct_compiled_op_86feacd077d8749f42b5d82709a80ba3(void) {
>> 00479                cleanup();
>> 00480            }
>> 00481
>> 00482            int init(PyObject* __ERROR, PyObject* storage_V3,
>> PyObject* storage_V5, PyObject* storage_V7, PyObject* storage_V9, PyObject*
>> storage_V11, PyObject* storage_V13, PyObject* storage_V1, PyObject*
>> storage_V15) {
>> 00483                Py_XINCREF(storage_V3);
>> 00484    Py_XINCREF(storage_V5);
>> 00485    Py_XINCREF(storage_V7);
>> 00486    Py_XINCREF(storage_V9);
>> 00487    Py_XINCREF(storage_V11);
>> 00488    Py_XINCREF(storage_V13);
>> 00489    Py_XINCREF(storage_V1);
>> 00490    Py_XINCREF(storage_V15);
>> 00491                this->storage_V3 = storage_V3;
>> 00492    this->storage_V5 = storage_V5;
>> 00493    this->storage_V7 = storage_V7;
>> 00494    this->storage_V9 = storage_V9;
>> 00495    this->storage_V11 = storage_V11;
>> 00496    this->storage_V13 = storage_V13;
>> 00497    this->storage_V1 = storage_V1;
>> 00498    this->storage_V15 = storage_V15;
>> 00499
>> 00500
>> 00501
>> 00502
>> 00503
>> 00504
>> 00505
>> 00506
>> 00507
>> 00508        py_V15 = PyList_GET_ITEM(storage_V15, 0);
>> 00509        {Py_XINCREF(py_V15);}
>> 00510
>> 00511    if (!PyObject_TypeCheck(py_V15, &PyGpuContextType)) {
>> 00512      PyErr_SetString(PyExc_TypeError, "expected a GpuContext");
>> 00513      {
>> 00514            if (!PyErr_Occurred()) {
>> 00515                PyErr_SetString(PyExc_RuntimeError,
>> 00516                    "Unexpected error in an Op's C code. "
>> 00517                    "No Python exception was set.");
>> 00518                }
>> 00519            return 15;
>> 00520    }
>> 00521    }
>> 00522
>> 00523    V15 = (PyGpuContextObject *)py_V15;
>> 00524    Py_INCREF(V15);
>> 00525
>> 00526
>> 00527    #define DTYPE_INPUT_0 npy_float16
>> 00528    #define TYPENUM_INPUT_0 23
>> 00529    #define ITEMSIZE_INPUT_0 2
>> 00530    #define DTYPE_INPUT_1 npy_float16
>> 00531    #define TYPENUM_INPUT_1 23
>> 00532    #define ITEMSIZE_INPUT_1 2
>> 00533    #define DTYPE_INPUT_2 npy_float16
>> 00534    #define TYPENUM_INPUT_2 23
>> 00535    #define ITEMSIZE_INPUT_2 2
>> 00536    #define DTYPE_INPUT_4 npy_float16
>> 00537    #define TYPENUM_INPUT_4 23
>> 00538    #define ITEMSIZE_INPUT_4 2
>> 00539    #define DTYPE_INPUT_5 npy_float16
>> 00540    #define TYPENUM_INPUT_5 23
>> 00541    #define ITEMSIZE_INPUT_5 2
>> 00542    #define DTYPE_OUTPUT_0 npy_float16
>> 00543    #define TYPENUM_OUTPUT_0 23
>> 00544    #define ITEMSIZE_OUTPUT_0 2
>> 00545    #define APPLY_SPECIFIC(str)
>> str##_node_86feacd077d8749f42b5d82709a80ba3_0
>> 00546    #define CONV_INPLACE 1
>> 00547    #define CONV_ALGO
>> CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM
>> 00548    #define FAIL { \
>> 00549            if (!PyErr_Occurred()) { \
>> 00550                PyErr_SetString(PyExc_RuntimeError, \
>> 00551                    "Unexpected error in an Op's C code. " \
>> 00552                    "No Python exception was set."); \
>> 00553                } \
>> 00554            return 17; \
>> 00555    }
>> 00556    #define PARAMS V15
>> 00557
>> 00558
>> 00559    {
>> 00560      // We need to keep a reference here to have it available in
>> the destructor.
>> 00561      ctx = PARAMS;
>> 00562      Py_INCREF(ctx);
>> 00563
>> 00564      cuda_enter(PARAMS->ctx);
>> 00565      cudnnStatus_t err;
>> 00566      APPLY_SPECIFIC(_handle) = NULL;
>> 00567      if ((err = cudnnCreate(&APPLY_SPECIFIC(_handle))) !=
>> CUDNN_STATUS_SUCCESS) {
>> 00568        PyErr_Format(PyExc_RuntimeError, "could not create cuDNN
>> handle: %s",
>> 00569                     cudnnGetErrorString(err));
>> 00570        cuda_exit(PARAMS->ctx);
>> 00571        FAIL;
>> 00572      }
>> 00573      if ((err = cudnnSetStream(APPLY_SPECIFIC(_handle),
>> 00574                                cuda_get_stream(PARAMS->ctx))) !=
>> CUDNN_STATUS_SUCCESS) {
>> 00575        PyErr_Format(PyExc_RuntimeError, "Could not set cudnn
>> stream: %s",
>> 00576                     cudnnGetErrorString(err));
>> 00577        cuda_exit(PARAMS->ctx);
>> 00578        FAIL;
>> 00579      }
>> 00580      cuda_exit(PARAMS->ctx);
>> 00581    }
>> 00582
>> 00583
>> 00584
>> 00585    cudnnStatus_t APPLY_SPECIFIC(err);
>> 00586    APPLY_SPECIFIC(input) = NULL;
>> 00587    APPLY_SPECIFIC(output) = NULL;
>> 00588    APPLY_SPECIFIC(kerns) = NULL;
>> 00589    if ((APPLY_SPECIFIC(err) =
>> cudnnCreateTensorDescriptor(&APPLY_SPECIFIC(input))) !=
>> CUDNN_STATUS_SUCCESS) {
>> 00590      PyErr_Format(PyExc_MemoryError, "could not allocate tensor
>> descriptor "
>> 00591               "(inp): %s",
>> cudnnGetErrorString(APPLY_SPECIFIC(err)));
>> 00592      FAIL;
>> 00593    }
>> 00594    if ((APPLY_SPECIFIC(err) =
>> cudnnCreateTensorDescriptor(&APPLY_SPECIFIC(output))) !=
>> CUDNN_STATUS_SUCCESS) {
>> 00595      PyErr_Format(PyExc_MemoryError, "could not allocate tensor
>> descriptor "
>> 00596                   "(out): %s",
>> cudnnGetErrorString(APPLY_SPECIFIC(err)));
>> 00597      FAIL;
>> 00598    }
>> 00599    if ((APPLY_SPECIFIC(err) =
>> cudnnCreateFilterDescriptor(&APPLY_SPECIFIC(kerns))) !=
>> CUDNN_STATUS_SUCCESS) {
>> 00600      PyErr_Format(PyExc_MemoryError, "could not allocate filter
>> descriptor: %s",
>> 00601               cudnnGetErrorString(APPLY_SPECIFIC(err)));
>> 00602      FAIL;
>> 00603    }
>> 00604
>> 00605
>> 00606
>> 00607    #ifdef CHOOSE_ALGO
>> 00608    reuse_algo = 0;
>> 00609    prev_algo = CONV_ALGO;
>> 00610    #ifndef CHOOSE_ONCE
>> 00611    memset(prev_img_dims, 0, sizeof(prev_img_dims));
>> 00612    memset(prev_kern_dims, 0, sizeof(prev_kern_dims));
>> 00613    #endif
>> 00614    #endif
>> 00615
>> 00616
>> 00617    #undef FAIL
>> 00618    #undef PARAMS
>> 00619    #undef DTYPE_INPUT_0
>> 00620    #undef TYPENUM_INPUT_0
>> 00621    #undef ITEMSIZE_INPUT_0
>> 00622    #undef DTYPE_INPUT_1
>> 00623    #undef TYPENUM_INPUT_1
>> 00624    #undef ITEMSIZE_INPUT_1
>> 00625    #undef DTYPE_INPUT_2
>> 00626    #undef TYPENUM_INPUT_2
>> 00627    #undef ITEMSIZE_INPUT_2
>> 00628    #undef DTYPE_INPUT_4
>> 00629    #undef TYPENUM_INPUT_4
>> 00630    #undef ITEMSIZE_INPUT_4
>> 00631    #undef DTYPE_INPUT_5
>> 00632    #undef TYPENUM_INPUT_5
>> 00633    #undef ITEMSIZE_INPUT_5
>> 00634    #undef DTYPE_OUTPUT_0
>> 00635    #undef TYPENUM_OUTPUT_0
>> 00636    #undef ITEMSIZE_OUTPUT_0
>> 00637    #undef APPLY_SPECIFIC
>> 00638    #undef CONV_INPLACE
>> 00639    #undef CONV_ALGO
>> 00640                this->__ERROR = __ERROR;
>> 00641                return 0;
>> 00642            }
>> 00643            void cleanup(void) {
>> 00644                __label_1:
>> 00645
>> 00646    double __DUMMY_1;
>> 00647    __label_3:
>> 00648
>> 00649    double __DUMMY_3;
>> 00650    __label_5:
>> 00651
>> 00652    double __DUMMY_5;
>> 00653    __label_7:
>> 00654
>> 00655    double __DUMMY_7;
>> 00656    __label_9:
>> 00657
>> 00658    double __DUMMY_9;
>> 00659    __label_11:
>> 00660
>> 00661    double __DUMMY_11;
>> 00662    __label_13:
>> 00663
>> 00664    double __DUMMY_13;
>> 00665    __label_15:
>> 00666    Py_XDECREF(V15); V15 = NULL;
>> 00667        {Py_XDECREF(py_V15);}
>> 00668
>> 00669    double __DUMMY_15;
>> 00670    __label_18:
>> 00671
>> 00672    #define DTYPE_INPUT_0 npy_float16
>> 00673    #define TYPENUM_INPUT_0 23
>> 00674    #define ITEMSIZE_INPUT_0 2
>> 00675    #define DTYPE_INPUT_1 npy_float16
>> 00676    #define TYPENUM_INPUT_1 23
>> 00677    #define ITEMSIZE_INPUT_1 2
>> 00678    #define DTYPE_INPUT_2 npy_float16
>> 00679    #define TYPENUM_INPUT_2 23
>> 00680    #define ITEMSIZE_INPUT_2 2
>> 00681    #define DTYPE_INPUT_4 npy_float16
>> 00682    #define TYPENUM_INPUT_4 23
>> 00683    #define ITEMSIZE_INPUT_4 2
>> 00684    #define DTYPE_INPUT_5 npy_float16
>> 00685    #define TYPENUM_INPUT_5 23
>> 00686    #define ITEMSIZE_INPUT_5 2
>> 00687    #define DTYPE_OUTPUT_0 npy_float16
>> 00688    #define TYPENUM_OUTPUT_0 23
>> 00689    #define ITEMSIZE_OUTPUT_0 2
>> 00690    #define APPLY_SPECIFIC(str)
>> str##_node_86feacd077d8749f42b5d82709a80ba3_0
>> 00691    #define CONV_INPLACE 1
>> 00692    #define CONV_ALGO
>> CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM
>> 00693
>> 00694
>> 00695    cuda_enter(ctx->ctx);
>> 00696    cudnnDestroy(APPLY_SPECIFIC(_handle));
>> 00697    cuda_exit(ctx->ctx);
>> 00698    Py_DECREF((PyObject *)ctx);
>> 00699
>> 00700
>> 00701    if (APPLY_SPECIFIC(input) != NULL)
>> 00702      cudnnDestroyTensorDescriptor(APPLY_SPECIFIC(input));
>> 00703    if (APPLY_SPECIFIC(output) != NULL)
>> 00704      cudnnDestroyTensorDescriptor(APPLY_SPECIFIC(output));
>> 00705    if (APPLY_SPECIFIC(kerns) != NULL)
>> 00706      cudnnDestroyFilterDescriptor(APPLY_SPECIFIC(kerns));
>> 00707
>> 00708    #undef DTYPE_INPUT_0
>> 00709    #undef TYPENUM_INPUT_0
>> 00710    #undef ITEMSIZE_INPUT_0
>> 00711    #undef DTYPE_INPUT_1
>> 00712    #undef TYPENUM_INPUT_1
>> 00713    #undef ITEMSIZE_INPUT_1
>> 00714    #undef DTYPE_INPUT_2
>> 00715    #undef TYPENUM_INPUT_2
>> 00716    #undef ITEMSIZE_INPUT_2
>> 00717    #undef DTYPE_INPUT_4
>> 00718    #undef TYPENUM_INPUT_4
>> 00719    #undef ITEMSIZE_INPUT_4
>> 00720    #undef DTYPE_INPUT_5
>> 00721    #undef TYPENUM_INPUT_5
>> 00722    #undef ITEMSIZE_INPUT_5
>> 00723    #undef DTYPE_OUTPUT_0
>> 00724    #undef TYPENUM_OUTPUT_0
>> 00725    #undef ITEMSIZE_OUTPUT_0
>> 00726    #undef APPLY_SPECIFIC
>> 00727    #undef CONV_INPLACE
>> 00728    #undef CONV_ALGO
>> 00729    double __DUMMY_18;
>> 00730
>> 00731                Py_XDECREF(this->storage_V3);
>> 00732    Py_XDECREF(this->storage_V5);
>> 00733    Py_XDECREF(this->storage_V7);
>> 00734    Py_XDECREF(this->storage_V9);
>> 00735    Py_XDECREF(this->storage_V11);
>> 00736    Py_XDECREF(this->storage_V13);
>> 00737    Py_XDECREF(this->storage_V1);
>> 00738    Py_XDECREF(this->storage_V15);
>> 00739            }
>> 00740            int run(void) {
>> 00741                int __failure = 0;
>> 00742
>> 00743        PyObject* py_V1;
>> 00744
>> 00745            PyGpuArrayObject *V1;
>> 00746
>> 00747        PyObject* py_V3;
>> 00748
>> 00749            PyGpuArrayObject *V3;
>> 00750
>> 00751        PyObject* py_V5;
>> 00752
>> 00753            PyGpuArrayObject *V5;
>> 00754
>> 00755        PyObject* py_V7;
>> 00756
>> 00757            PyGpuArrayObject *V7;
>> 00758
>> 00759        PyObject* py_V9;
>> 00760
>> 00761            cudnnConvolutionDescriptor_t V9;
>> 00762
>> 00763        PyObject* py_V11;
>> 00764
>> 00765                    typedef npy_float16 V11_dtype; // Deprecated use
>> dtype_V11 instead.
>> 00766                    typedef npy_float16 dtype_V11;
>> 00767
>> 00768            npy_float16 V11;
>> 00769
>> 00770        PyObject* py_V13;
>> 00771
>> 00772                    typedef npy_float16 V13_dtype; // Deprecated use
>> dtype_V13 instead.
>> 00773                    typedef npy_float16 dtype_V13;
>> 00774
>> 00775            npy_float16 V13;
>> 00776
>> 00777    {
>> 00778
>> 00779        py_V1 = PyList_GET_ITEM(storage_V1, 0);
>> 00780        {Py_XINCREF(py_V1);}
>> 00781
>> 00782            if (py_V1 == Py_None)
>> 00783            {
>> 00784                V1 = NULL;
>> 00785            }
>> 00786            else
>> 00787            {
>> 00788
>> 00789            V1 = NULL;
>> 00790            if (py_V1 == Py_None) {
>> 00791                PyErr_SetString(PyExc_ValueError, "expected a
>> GpuArray, not None");
>> 00792                {
>> 00793            __failure = 2;
>> 00794            if (!PyErr_Occurred()) {
>> 00795                PyErr_SetString(PyExc_RuntimeError,
>> 00796                    "Unexpected error in an Op's C code. "
>> 00797                    "No Python exception was set.");
>> 00798                }
>> 00799            goto __label_2;}
>> 00800            }
>> 00801            /* First check if we are the base type exactly (the most
>> common case),
>> 00802               then do the full subclass check if needed. */
>> 00803            if (py_V1->ob_type != &PyGpuArrayType &&
>> 00804                !PyObject_TypeCheck(py_V1, &PyGpuArrayType)) {
>> 00805                PyE
>>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "theano-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to