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] <javascript:>>:
>
>> 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] <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