Frederic,
I'll do it and give you a feedback,
many thanks
Luca

On Tuesday, July 19, 2016 at 10:09:21 PM UTC+2, nouiz wrote:
>
> We have a PR that upgrade some stuff about float16:
>
> https://github.com/Theano/Theano/pull/4764/files
>
> It probably fix your problem. Can you try it to confirm that you don't 
> have a different problem?
>
> thanks
>
> Frédéric
>
> On Fri, Jul 15, 2016 at 4:55 AM, <[email protected] <javascript:>> 
> wrote:
>
>> ok I try.
>> thanks
>>
>> On Thursday, July 14, 2016 at 11:44:41 PM UTC+2, Arnaud Bergeron wrote:
>>>
>>> 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] <javascript:>.
>> 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