cudnn_sys/
lib.rs

1//! Defines the Foreign Function Interface for the CUDA cuDNN API.
2#![allow(non_camel_case_types)]
3
4extern crate libc;
5
6// CUDA types
7
8pub type size_t = ::libc::c_ulong;
9pub type Enum_cudaError = ::libc::c_uint;
10pub type Enum_cudaMemcpyKind = ::libc::c_uint;
11
12pub type cudaMemoryPtr = *mut ::libc::c_void;
13
14pub enum MemcpyKind {
15    cudaMemcpyHostToHost = 0,
16    cudaMemcpyHostToDevice = 1,
17    cudaMemcpyDeviceToHost = 2,
18    cudaMemcpyDeviceToDevice = 3,
19    cudaMemcpyDefault = 4,
20}
21
22pub type cudaError_t = Enum_cudaError;
23
24// CUDNN types
25
26pub enum Struct_CUstream_st { }
27pub type cudaStream_t = *mut Struct_CUstream_st;
28
29pub enum Struct_cudnnContext { }
30pub type cudnnHandle_t = *mut Struct_cudnnContext;
31
32#[repr(C)]
33#[derive(PartialEq, Debug, Copy, Clone)]
34pub enum cudnnStatus_t {
35    CUDNN_STATUS_SUCCESS = 0,
36    CUDNN_STATUS_NOT_INITIALIZED = 1,
37    CUDNN_STATUS_ALLOC_FAILED = 2,
38    CUDNN_STATUS_BAD_PARAM = 3,
39    CUDNN_STATUS_INTERNAL_ERROR = 4,
40    CUDNN_STATUS_INVALID_VALUE = 5,
41    CUDNN_STATUS_ARCH_MISMATCH = 6,
42    CUDNN_STATUS_MAPPING_ERROR = 7,
43    CUDNN_STATUS_EXECUTION_FAILED = 8,
44    CUDNN_STATUS_NOT_SUPPORTED = 9,
45    CUDNN_STATUS_LICENSE_ERROR = 10,
46}
47
48pub enum Struct_cudnnTensorStruct { }
49pub type cudnnTensorDescriptor_t = *mut Struct_cudnnTensorStruct;
50
51pub enum Struct_cudnnConvolutionStruct { }
52pub type cudnnConvolutionDescriptor_t = *mut Struct_cudnnConvolutionStruct;
53
54pub enum Struct_cudnnPoolingStruct { }
55pub type cudnnPoolingDescriptor_t = *mut Struct_cudnnPoolingStruct;
56
57pub enum Struct_cudnnFilterStruct { }
58pub type cudnnFilterDescriptor_t = *mut Struct_cudnnFilterStruct;
59
60pub enum Struct_cudnnLRNStruct { }
61pub type cudnnLRNDescriptor_t = *mut Struct_cudnnLRNStruct;
62
63#[repr(C)]
64#[derive(PartialEq, Debug, Copy, Clone)]
65pub enum cudnnDataType_t {
66    CUDNN_DATA_FLOAT = 0,
67    CUDNN_DATA_DOUBLE = 1,
68    CUDNN_DATA_HALF = 2,
69}
70
71#[repr(C)]
72#[derive(PartialEq, Debug, Copy, Clone)]
73pub enum cudnnTensorFormat_t {
74    CUDNN_TENSOR_NCHW = 0,
75    CUDNN_TENSOR_NHWC = 1,
76}
77
78#[repr(C)]
79#[derive(PartialEq, Debug, Copy, Clone)]
80pub enum cudnnAddMode_t {
81    CUDNN_ADD_IMAGE = 0,
82    CUDNN_ADD_FEATURE_MAP = 1,
83    CUDNN_ADD_SAME_C = 2,
84    CUDNN_ADD_FULL_TENSOR = 3,
85}
86
87#[repr(C)]
88#[derive(PartialEq, Debug, Copy, Clone)]
89pub enum cudnnConvolutionMode_t {
90    CUDNN_CONVOLUTION = 0,
91    CUDNN_CROSS_CORRELATION = 1,
92}
93
94#[repr(C)]
95#[derive(PartialEq, Debug, Copy, Clone)]
96pub enum cudnnConvolutionFwdPreference_t {
97    CUDNN_CONVOLUTION_FWD_NO_WORKSPACE = 0,
98    CUDNN_CONVOLUTION_FWD_PREFER_FASTEST = 1,
99    CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT = 2,
100}
101
102#[repr(C)]
103#[derive(PartialEq, Debug, Copy, Clone)]
104pub enum cudnnConvolutionFwdAlgo_t {
105    CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM = 0,
106    CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM = 1,
107    CUDNN_CONVOLUTION_FWD_ALGO_GEMM = 2,
108    CUDNN_CONVOLUTION_FWD_ALGO_DIRECT = 3,
109    CUDNN_CONVOLUTION_FWD_ALGO_FFT = 4,
110    CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING = 5,
111}
112
113#[repr(C)]
114#[derive(Copy)]
115pub struct Struct_Unnamed14 {
116    pub algo: cudnnConvolutionFwdAlgo_t,
117    pub status: cudnnStatus_t,
118    pub time: ::libc::c_float,
119    pub memory: ::libc::size_t,
120}
121impl ::std::clone::Clone for Struct_Unnamed14 {
122    fn clone(&self) -> Self { *self }
123}
124impl ::std::default::Default for Struct_Unnamed14 {
125    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
126}
127pub type cudnnConvolutionFwdAlgoPerf_t = Struct_Unnamed14;
128
129#[repr(C)]
130#[derive(PartialEq, Debug, Copy, Clone)]
131pub enum cudnnConvolutionBwdFilterPreference_t {
132    CUDNN_CONVOLUTION_BWD_FILTER_NO_WORKSPACE = 0,
133    CUDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST = 1,
134    CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT = 2,
135}
136
137#[repr(C)]
138#[derive(PartialEq, Debug, Copy, Clone)]
139pub enum cudnnConvolutionBwdFilterAlgo_t {
140    CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0 = 0,
141    CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1 = 1,
142    CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT = 2,
143    CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3 = 3,
144}
145
146#[repr(C)]
147#[derive(Copy)]
148pub struct Struct_Unnamed17 {
149    pub algo: cudnnConvolutionBwdFilterAlgo_t,
150    pub status: cudnnStatus_t,
151    pub time: ::libc::c_float,
152    pub memory: ::libc::size_t,
153}
154
155impl ::std::clone::Clone for Struct_Unnamed17 {
156    fn clone(&self) -> Self { *self }
157}
158
159impl ::std::default::Default for Struct_Unnamed17 {
160    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
161}
162
163pub type cudnnConvolutionBwdFilterAlgoPerf_t = Struct_Unnamed17;
164
165#[repr(C)]
166#[derive(PartialEq, Debug, Copy, Clone)]
167pub enum cudnnConvolutionBwdDataPreference_t {
168    CUDNN_CONVOLUTION_BWD_DATA_NO_WORKSPACE = 0,
169    CUDNN_CONVOLUTION_BWD_DATA_PREFER_FASTEST = 1,
170    CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT = 2,
171}
172
173#[repr(C)]
174#[derive(PartialEq, Debug, Copy, Clone)]
175pub enum cudnnConvolutionBwdDataAlgo_t {
176    CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 = 0,
177    CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 = 1,
178    CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT = 2,
179    CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING = 3,
180}
181
182#[repr(C)]
183#[derive(Copy)]
184pub struct Struct_Unnamed20 {
185    pub algo: cudnnConvolutionBwdDataAlgo_t,
186    pub status: cudnnStatus_t,
187    pub time: ::libc::c_float,
188    pub memory: ::libc::size_t,
189}
190
191impl ::std::clone::Clone for Struct_Unnamed20 {
192    fn clone(&self) -> Self { *self }
193}
194
195impl ::std::default::Default for Struct_Unnamed20 {
196    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
197}
198
199pub type cudnnConvolutionBwdDataAlgoPerf_t = Struct_Unnamed20;
200
201#[repr(C)]
202#[derive(PartialEq, Debug, Copy, Clone)]
203pub enum cudnnSoftmaxAlgorithm_t {
204    CUDNN_SOFTMAX_FAST = 0,
205    CUDNN_SOFTMAX_ACCURATE = 1,
206    CUDNN_SOFTMAX_LOG = 2,
207}
208
209#[repr(C)]
210#[derive(PartialEq, Debug, Copy, Clone)]
211pub enum cudnnSoftmaxMode_t {
212    CUDNN_SOFTMAX_MODE_INSTANCE = 0,
213    CUDNN_SOFTMAX_MODE_CHANNEL = 1,
214}
215
216#[repr(C)]
217#[derive(PartialEq, Debug, Copy, Clone)]
218pub enum cudnnPoolingMode_t {
219    CUDNN_POOLING_MAX = 0,
220    CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING = 1,
221    CUDNN_POOLING_AVERAGE_COUNT_EXCLUDE_PADDING = 2,
222}
223
224#[repr(C)]
225#[derive(PartialEq, Debug, Copy, Clone)]
226pub enum cudnnActivationMode_t {
227    CUDNN_ACTIVATION_SIGMOID = 0,
228    CUDNN_ACTIVATION_RELU = 1,
229    CUDNN_ACTIVATION_TANH = 2,
230}
231
232pub type Enum_Unnamed25 = ::libc::c_uint;
233pub const CUDNN_LRN_CROSS_CHANNEL_DIM1: ::libc::c_uint = 0;
234pub type cudnnLRNMode_t = Enum_Unnamed25;
235
236pub type Enum_Unnamed26 = ::libc::c_uint;
237pub const CUDNN_DIVNORM_PRECOMPUTED_MEANS: ::libc::c_uint = 0;
238pub type cudnnDivNormMode_t = Enum_Unnamed26;
239
240extern "C" {
241    pub fn cudnnGetVersion() -> ::libc::size_t;
242
243    pub fn cudnnGetErrorString(status: cudnnStatus_t) -> *const ::libc::c_char;
244
245    pub fn cudnnCreate(handle: *mut cudnnHandle_t) -> cudnnStatus_t;
246
247    pub fn cudnnDestroy(handle: cudnnHandle_t) -> cudnnStatus_t;
248
249    pub fn cudnnSetStream(handle: cudnnHandle_t, streamId: cudaStream_t) -> cudnnStatus_t;
250
251    pub fn cudnnGetStream(handle: cudnnHandle_t, streamId: *mut cudaStream_t) -> cudnnStatus_t;
252
253    pub fn cudnnCreateTensorDescriptor(tensorDesc: *mut cudnnTensorDescriptor_t) -> cudnnStatus_t;
254
255    pub fn cudnnSetTensor4dDescriptor(
256        tensorDesc: cudnnTensorDescriptor_t,
257        format: cudnnTensorFormat_t,
258        dataType: cudnnDataType_t,
259        n: ::libc::c_int,
260        c: ::libc::c_int,
261        h: ::libc::c_int,
262        w: ::libc::c_int
263    ) -> cudnnStatus_t;
264
265    pub fn cudnnSetTensor4dDescriptorEx(
266        tensorDesc: cudnnTensorDescriptor_t,
267        dataType: cudnnDataType_t,
268        n: ::libc::c_int,
269        c: ::libc::c_int,
270        h: ::libc::c_int,
271        w: ::libc::c_int,
272        nStride: ::libc::c_int,
273        cStride: ::libc::c_int,
274        hStride: ::libc::c_int,
275        wStride: ::libc::c_int
276    ) -> cudnnStatus_t;
277
278    pub fn cudnnGetTensor4dDescriptor(
279        tensorDesc: cudnnTensorDescriptor_t,
280        dataType: *mut cudnnDataType_t,
281        n: *mut ::libc::c_int,
282        c: *mut ::libc::c_int,
283        h: *mut ::libc::c_int,
284        w: *mut ::libc::c_int,
285        nStride: *mut ::libc::c_int,
286        cStride: *mut ::libc::c_int,
287        hStride: *mut ::libc::c_int,
288        wStride: *mut ::libc::c_int
289    ) -> cudnnStatus_t;
290
291    pub fn cudnnSetTensorNdDescriptor(
292        tensorDesc: cudnnTensorDescriptor_t,
293        dataType: cudnnDataType_t,
294        nbDims: ::libc::c_int,
295        dimA: *const ::libc::c_int,
296        strideA: *const ::libc::c_int
297    ) -> cudnnStatus_t;
298
299    pub fn cudnnGetTensorNdDescriptor(
300        tensorDesc: cudnnTensorDescriptor_t,
301        nbDimsRequested: ::libc::c_int,
302        dataType: *mut cudnnDataType_t,
303        nbDims: *mut ::libc::c_int,
304        dimA: *mut ::libc::c_int,
305        strideA: *mut ::libc::c_int
306    ) -> cudnnStatus_t;
307
308    pub fn cudnnDestroyTensorDescriptor(tensorDesc: cudnnTensorDescriptor_t) -> cudnnStatus_t;
309
310    pub fn cudnnTransformTensor(
311        handle: cudnnHandle_t,
312        alpha: *const ::libc::c_void,
313        srcDesc: cudnnTensorDescriptor_t,
314        srcData: *const ::libc::c_void,
315        beta: *const ::libc::c_void,
316        destDesc: cudnnTensorDescriptor_t,
317        destData: *mut ::libc::c_void
318    ) -> cudnnStatus_t;
319
320    pub fn cudnnAddTensor(
321        handle: cudnnHandle_t, mode: cudnnAddMode_t,
322        alpha: *const ::libc::c_void,
323        biasDesc: cudnnTensorDescriptor_t,
324        biasData: *const ::libc::c_void,
325        beta: *const ::libc::c_void,
326        srcDestDesc: cudnnTensorDescriptor_t,
327        srcDestData: *mut ::libc::c_void
328    ) -> cudnnStatus_t;
329
330    pub fn cudnnAddTensor_v3(
331        handle: cudnnHandle_t,
332        alpha: *const ::libc::c_void,
333        biasDesc: cudnnTensorDescriptor_t,
334        biasData: *const ::libc::c_void,
335        beta: *const ::libc::c_void,
336        srcDestDesc: cudnnTensorDescriptor_t,
337        srcDestData: *mut ::libc::c_void
338    ) -> cudnnStatus_t;
339
340    pub fn cudnnSetTensor(
341        handle: cudnnHandle_t,
342        srcDestDesc: cudnnTensorDescriptor_t,
343        srcDestData: *mut ::libc::c_void,
344        value: *const ::libc::c_void
345    ) -> cudnnStatus_t;
346
347    pub fn cudnnScaleTensor(
348        handle: cudnnHandle_t,
349        srcDestDesc: cudnnTensorDescriptor_t,
350        srcDestData: *mut ::libc::c_void,
351        alpha: *const ::libc::c_void
352    ) -> cudnnStatus_t;
353
354    pub fn cudnnCreateFilterDescriptor(filterDesc: *mut cudnnFilterDescriptor_t) -> cudnnStatus_t;
355
356    pub fn cudnnSetFilter4dDescriptor(
357        filterDesc: cudnnFilterDescriptor_t,
358        dataType: cudnnDataType_t,
359        k: ::libc::c_int, c: ::libc::c_int,
360        h: ::libc::c_int, w: ::libc::c_int
361    ) -> cudnnStatus_t;
362
363    pub fn cudnnGetFilter4dDescriptor(
364        filterDesc: cudnnFilterDescriptor_t,
365        dataType: *mut cudnnDataType_t,
366        k: *mut ::libc::c_int,
367        c: *mut ::libc::c_int,
368        h: *mut ::libc::c_int,
369        w: *mut ::libc::c_int
370    ) -> cudnnStatus_t;
371
372    pub fn cudnnSetFilterNdDescriptor(
373        filterDesc: cudnnFilterDescriptor_t,
374        dataType: cudnnDataType_t,
375        nbDims: ::libc::c_int,
376        filterDimA: *const ::libc::c_int
377    ) -> cudnnStatus_t;
378
379    pub fn cudnnGetFilterNdDescriptor(
380        filterDesc: cudnnFilterDescriptor_t,
381        nbDimsRequested: ::libc::c_int,
382        dataType: *mut cudnnDataType_t,
383        nbDims: *mut ::libc::c_int,
384        filterDimA: *mut ::libc::c_int
385    ) -> cudnnStatus_t;
386
387    pub fn cudnnDestroyFilterDescriptor(filterDesc: cudnnFilterDescriptor_t) -> cudnnStatus_t;
388
389    pub fn cudnnCreateConvolutionDescriptor(convDesc: *mut cudnnConvolutionDescriptor_t) -> cudnnStatus_t;
390
391    pub fn cudnnSetConvolution2dDescriptor(
392        convDesc: cudnnConvolutionDescriptor_t,
393        pad_h: ::libc::c_int,
394        pad_w: ::libc::c_int,
395        u: ::libc::c_int, v: ::libc::c_int,
396        upscalex: ::libc::c_int,
397        upscaley: ::libc::c_int,
398        mode: cudnnConvolutionMode_t
399    ) -> cudnnStatus_t;
400
401    pub fn cudnnGetConvolution2dDescriptor(
402        convDesc: cudnnConvolutionDescriptor_t,
403        pad_h: *mut ::libc::c_int,
404        pad_w: *mut ::libc::c_int,
405        u: *mut ::libc::c_int,
406        v: *mut ::libc::c_int,
407        upscalex: *mut ::libc::c_int,
408        upscaley: *mut ::libc::c_int,
409        mode: *mut cudnnConvolutionMode_t
410    ) -> cudnnStatus_t;
411
412    pub fn cudnnGetConvolution2dForwardOutputDim(
413        convDesc: cudnnConvolutionDescriptor_t,
414        inputTensorDesc: cudnnTensorDescriptor_t,
415        filterDesc: cudnnFilterDescriptor_t,
416        n: *mut ::libc::c_int,
417        c: *mut ::libc::c_int,
418        h: *mut ::libc::c_int,
419        w: *mut ::libc::c_int
420    ) -> cudnnStatus_t;
421
422    pub fn cudnnSetConvolutionNdDescriptor(
423        convDesc: cudnnConvolutionDescriptor_t,
424        arrayLength: ::libc::c_int,
425        padA: *const ::libc::c_int,
426        filterStrideA: *const ::libc::c_int,
427        upscaleA: *const ::libc::c_int,
428        mode: cudnnConvolutionMode_t
429    ) -> cudnnStatus_t;
430
431    pub fn cudnnGetConvolutionNdDescriptor(
432        convDesc: cudnnConvolutionDescriptor_t,
433        arrayLengthRequested: ::libc::c_int,
434        arrayLength: *mut ::libc::c_int,
435        padA: *mut ::libc::c_int,
436        strideA: *mut ::libc::c_int,
437        upscaleA: *mut ::libc::c_int,
438        mode: *mut cudnnConvolutionMode_t
439    ) -> cudnnStatus_t;
440
441    pub fn cudnnSetConvolutionNdDescriptor_v3(
442        convDesc: cudnnConvolutionDescriptor_t,
443        arrayLength: ::libc::c_int,
444        padA: *const ::libc::c_int,
445        filterStrideA: *const ::libc::c_int,
446        upscaleA: *const ::libc::c_int,
447        mode: cudnnConvolutionMode_t,
448        dataType: cudnnDataType_t
449    ) -> cudnnStatus_t;
450
451    pub fn cudnnGetConvolutionNdDescriptor_v3(
452        convDesc: cudnnConvolutionDescriptor_t,
453        arrayLengthRequested: ::libc::c_int,
454        arrayLength: *mut ::libc::c_int,
455        padA: *mut ::libc::c_int,
456        strideA: *mut ::libc::c_int,
457        upscaleA: *mut ::libc::c_int,
458        mode: *mut cudnnConvolutionMode_t,
459        dataType: *mut cudnnDataType_t
460    ) -> cudnnStatus_t;
461
462    pub fn cudnnGetConvolutionNdForwardOutputDim(
463        convDesc: cudnnConvolutionDescriptor_t,
464        inputTensorDesc: cudnnTensorDescriptor_t,
465        filterDesc: cudnnFilterDescriptor_t,
466        nbDims: ::libc::c_int,
467        tensorOuputDimA: *mut ::libc::c_int
468    ) -> cudnnStatus_t;
469
470    pub fn cudnnDestroyConvolutionDescriptor(convDesc: cudnnConvolutionDescriptor_t) -> cudnnStatus_t;
471
472    pub fn cudnnFindConvolutionForwardAlgorithm(
473        handle: cudnnHandle_t,
474        srcDesc: cudnnTensorDescriptor_t,
475        filterDesc: cudnnFilterDescriptor_t,
476        convDesc: cudnnConvolutionDescriptor_t,
477        destDesc: cudnnTensorDescriptor_t,
478        requestedAlgoCount: ::libc::c_int,
479        returnedAlgoCount: *mut ::libc::c_int,
480        perfResults: *mut cudnnConvolutionFwdAlgoPerf_t
481    ) -> cudnnStatus_t;
482
483    pub fn cudnnGetConvolutionForwardAlgorithm(
484        handle: cudnnHandle_t,
485        srcDesc: cudnnTensorDescriptor_t,
486        filterDesc: cudnnFilterDescriptor_t,
487        convDesc: cudnnConvolutionDescriptor_t,
488        destDesc: cudnnTensorDescriptor_t,
489        preference: cudnnConvolutionFwdPreference_t,
490        memoryLimitInbytes: ::libc::size_t,
491        algo: *mut cudnnConvolutionFwdAlgo_t
492    ) -> cudnnStatus_t;
493
494    pub fn cudnnGetConvolutionForwardWorkspaceSize(
495        handle: cudnnHandle_t,
496        srcDesc: cudnnTensorDescriptor_t,
497        filterDesc: cudnnFilterDescriptor_t,
498        convDesc: cudnnConvolutionDescriptor_t,
499        destDesc: cudnnTensorDescriptor_t,
500        algo: cudnnConvolutionFwdAlgo_t,
501        sizeInBytes: *mut ::libc::size_t,
502    ) -> cudnnStatus_t;
503
504    pub fn cudnnConvolutionForward(
505        handle: cudnnHandle_t,
506        alpha: *const ::libc::c_void,
507        srcDesc: cudnnTensorDescriptor_t,
508        srcData: *const ::libc::c_void,
509        filterDesc: cudnnFilterDescriptor_t,
510        filterData: *const ::libc::c_void,
511        convDesc: cudnnConvolutionDescriptor_t,
512        algo: cudnnConvolutionFwdAlgo_t,
513        workSpace: *mut ::libc::c_void,
514        workSpaceSizeInBytes: ::libc::size_t,
515        beta: *const ::libc::c_void,
516        destDesc: cudnnTensorDescriptor_t,
517        destData: *mut ::libc::c_void
518    ) -> cudnnStatus_t;
519
520    pub fn cudnnConvolutionBackwardBias(
521        handle: cudnnHandle_t,
522        alpha: *const ::libc::c_void,
523        srcDesc: cudnnTensorDescriptor_t,
524        srcData: *const ::libc::c_void,
525        beta: *const ::libc::c_void,
526        destDesc: cudnnTensorDescriptor_t,
527        destData: *mut ::libc::c_void
528    ) -> cudnnStatus_t;
529
530    pub fn cudnnFindConvolutionBackwardFilterAlgorithm(
531        handle: cudnnHandle_t,
532        srcDesc: cudnnTensorDescriptor_t,
533        diffDesc: cudnnTensorDescriptor_t,
534        convDesc: cudnnConvolutionDescriptor_t,
535        gradDesc: cudnnFilterDescriptor_t,
536        requestedAlgoCount: ::libc::c_int,
537        returnedAlgoCount: *mut ::libc::c_int,
538        perfResults: *mut cudnnConvolutionBwdFilterAlgoPerf_t
539    ) -> cudnnStatus_t;
540
541    pub fn cudnnGetConvolutionBackwardFilterAlgorithm(
542        handle: cudnnHandle_t,
543        srcDesc: cudnnTensorDescriptor_t,
544        diffDesc: cudnnTensorDescriptor_t,
545        convDesc: cudnnConvolutionDescriptor_t,
546        gradDesc: cudnnFilterDescriptor_t,
547        preference: cudnnConvolutionBwdFilterPreference_t,
548        memoryLimitInbytes: ::libc::size_t,
549        algo: *mut cudnnConvolutionBwdFilterAlgo_t
550    ) -> cudnnStatus_t;
551
552    pub fn cudnnGetConvolutionBackwardFilterWorkspaceSize(
553        handle: cudnnHandle_t,
554        srcDesc: cudnnTensorDescriptor_t,
555        diffDesc: cudnnTensorDescriptor_t,
556        convDesc: cudnnConvolutionDescriptor_t,
557        gradDesc: cudnnFilterDescriptor_t,
558        algo: cudnnConvolutionBwdFilterAlgo_t,
559        sizeInBytes: *mut ::libc::size_t,
560    ) -> cudnnStatus_t;
561
562    pub fn cudnnConvolutionBackwardFilter_v3(
563        handle: cudnnHandle_t,
564        alpha: *const ::libc::c_void,
565        srcDesc: cudnnTensorDescriptor_t,
566        srcData: *const ::libc::c_void,
567        diffDesc: cudnnTensorDescriptor_t,
568        diffData: *const ::libc::c_void,
569        convDesc: cudnnConvolutionDescriptor_t,
570        algo: cudnnConvolutionBwdFilterAlgo_t,
571        workSpace: *mut ::libc::c_void,
572        workSpaceSizeInBytes: ::libc::size_t,
573        beta: *const ::libc::c_void,
574        gradDesc: cudnnFilterDescriptor_t,
575        gradData: *mut ::libc::c_void
576    ) -> cudnnStatus_t;
577
578    pub fn cudnnConvolutionBackwardFilter(
579        handle: cudnnHandle_t,
580        alpha: *const ::libc::c_void,
581        srcDesc: cudnnTensorDescriptor_t,
582        srcData: *const ::libc::c_void,
583        diffDesc: cudnnTensorDescriptor_t,
584        diffData: *const ::libc::c_void,
585        convDesc: cudnnConvolutionDescriptor_t,
586        beta: *const ::libc::c_void,
587        gradDesc: cudnnFilterDescriptor_t,
588        gradData: *mut ::libc::c_void
589    ) -> cudnnStatus_t;
590
591    pub fn cudnnFindConvolutionBackwardDataAlgorithm(
592        handle: cudnnHandle_t,
593        filterDesc: cudnnFilterDescriptor_t,
594        diffDesc: cudnnTensorDescriptor_t,
595        convDesc: cudnnConvolutionDescriptor_t,
596        gradDesc: cudnnTensorDescriptor_t,
597        requestedAlgoCount: ::libc::c_int,
598        returnedAlgoCount: *mut ::libc::c_int,
599        perfResults: *mut cudnnConvolutionBwdDataAlgoPerf_t
600    ) -> cudnnStatus_t;
601
602    pub fn cudnnGetConvolutionBackwardDataAlgorithm(
603        handle: cudnnHandle_t,
604        filterDesc: cudnnFilterDescriptor_t,
605        diffDesc: cudnnTensorDescriptor_t,
606        convDesc: cudnnConvolutionDescriptor_t,
607        gradDesc: cudnnTensorDescriptor_t,
608        preference: cudnnConvolutionBwdDataPreference_t,
609        memoryLimitInbytes: ::libc::size_t,
610        algo: *mut cudnnConvolutionBwdDataAlgo_t
611    ) -> cudnnStatus_t;
612
613    pub fn cudnnGetConvolutionBackwardDataWorkspaceSize(
614        handle: cudnnHandle_t,
615        filterDesc: cudnnFilterDescriptor_t,
616        diffDesc: cudnnTensorDescriptor_t,
617        convDesc: cudnnConvolutionDescriptor_t,
618        gradDesc: cudnnTensorDescriptor_t,
619        algo: cudnnConvolutionBwdDataAlgo_t,
620        sizeInBytes: *mut ::libc::size_t,
621    ) -> cudnnStatus_t;
622
623    pub fn cudnnConvolutionBackwardData_v3(
624        handle: cudnnHandle_t,
625        alpha: *const ::libc::c_void,
626        filterDesc: cudnnFilterDescriptor_t,
627        filterData: *const ::libc::c_void,
628        diffDesc: cudnnTensorDescriptor_t,
629        diffData: *const ::libc::c_void,
630        convDesc: cudnnConvolutionDescriptor_t,
631        algo: cudnnConvolutionBwdDataAlgo_t,
632        workSpace: *mut ::libc::c_void,
633        workSpaceSizeInBytes: ::libc::size_t,
634        beta: *const ::libc::c_void,
635        gradDesc: cudnnTensorDescriptor_t,
636        gradData: *mut ::libc::c_void
637    ) -> cudnnStatus_t;
638
639    pub fn cudnnConvolutionBackwardData(
640        handle: cudnnHandle_t,
641        alpha: *const ::libc::c_void,
642        filterDesc: cudnnFilterDescriptor_t,
643        filterData: *const ::libc::c_void,
644        diffDesc: cudnnTensorDescriptor_t,
645        diffData: *const ::libc::c_void,
646        convDesc: cudnnConvolutionDescriptor_t,
647        beta: *const ::libc::c_void,
648        gradDesc: cudnnTensorDescriptor_t,
649        gradData: *mut ::libc::c_void
650    ) -> cudnnStatus_t;
651
652    pub fn cudnnIm2Col(
653        handle: cudnnHandle_t,
654        srcDesc: cudnnTensorDescriptor_t,
655        srcData: *const ::libc::c_void,
656        filterDesc: cudnnFilterDescriptor_t,
657        convDesc: cudnnConvolutionDescriptor_t,
658        colBuffer: *mut ::libc::c_void
659    ) -> cudnnStatus_t;
660
661    pub fn cudnnSoftmaxForward(
662        handle: cudnnHandle_t,
663        algorithm: cudnnSoftmaxAlgorithm_t,
664        mode: cudnnSoftmaxMode_t,
665        alpha: *const ::libc::c_void,
666        srcDesc: cudnnTensorDescriptor_t,
667        srcData: *const ::libc::c_void,
668        beta: *const ::libc::c_void,
669        destDesc: cudnnTensorDescriptor_t,
670        destData: *mut ::libc::c_void
671    ) -> cudnnStatus_t;
672
673    pub fn cudnnSoftmaxBackward(
674        handle: cudnnHandle_t,
675        algorithm: cudnnSoftmaxAlgorithm_t,
676        mode: cudnnSoftmaxMode_t,
677        alpha: *const ::libc::c_void,
678        srcDesc: cudnnTensorDescriptor_t,
679        srcData: *const ::libc::c_void,
680        srcDiffDesc: cudnnTensorDescriptor_t,
681        srcDiffData: *const ::libc::c_void,
682        beta: *const ::libc::c_void,
683        destDiffDesc: cudnnTensorDescriptor_t,
684        destDiffData: *mut ::libc::c_void
685    ) -> cudnnStatus_t;
686
687    pub fn cudnnCreatePoolingDescriptor(poolingDesc: *mut cudnnPoolingDescriptor_t) -> cudnnStatus_t;
688
689    pub fn cudnnSetPooling2dDescriptor(
690        poolingDesc: cudnnPoolingDescriptor_t,
691        mode: cudnnPoolingMode_t,
692        windowHeight: ::libc::c_int,
693        windowWidth: ::libc::c_int,
694        verticalPadding: ::libc::c_int,
695        horizontalPadding: ::libc::c_int,
696        verticalStride: ::libc::c_int,
697        horizontalStride: ::libc::c_int
698    ) -> cudnnStatus_t;
699
700    pub fn cudnnGetPooling2dDescriptor(
701        poolingDesc: cudnnPoolingDescriptor_t,
702        mode: *mut cudnnPoolingMode_t,
703        windowHeight: *mut ::libc::c_int,
704        windowWidth: *mut ::libc::c_int,
705        verticalPadding: *mut ::libc::c_int,
706        horizontalPadding: *mut ::libc::c_int,
707        verticalStride: *mut ::libc::c_int,
708        horizontalStride: *mut ::libc::c_int
709    ) -> cudnnStatus_t;
710
711    pub fn cudnnSetPoolingNdDescriptor(
712        poolingDesc: cudnnPoolingDescriptor_t,
713        mode: cudnnPoolingMode_t,
714        nbDims: ::libc::c_int,
715        windowDimA: *const ::libc::c_int,
716        paddingA: *const ::libc::c_int,
717        strideA: *const ::libc::c_int
718    ) -> cudnnStatus_t;
719
720    pub fn cudnnGetPoolingNdDescriptor(
721        poolingDesc: cudnnPoolingDescriptor_t,
722        nbDimsRequested: ::libc::c_int,
723        mode: *mut cudnnPoolingMode_t,
724        nbDims: *mut ::libc::c_int,
725        windowDimA: *mut ::libc::c_int,
726        paddingA: *mut ::libc::c_int,
727        strideA: *mut ::libc::c_int
728    ) -> cudnnStatus_t;
729
730    pub fn cudnnGetPoolingNdForwardOutputDim(
731        poolingDesc: cudnnPoolingDescriptor_t,
732        inputTensorDesc: cudnnTensorDescriptor_t,
733        nbDims: ::libc::c_int,
734        outputTensorDimA: *mut ::libc::c_int
735    ) -> cudnnStatus_t;
736
737    pub fn cudnnGetPooling2dForwardOutputDim(
738        poolingDesc: cudnnPoolingDescriptor_t,
739        inputTensorDesc: cudnnTensorDescriptor_t,
740        outN: *mut ::libc::c_int,
741        outC: *mut ::libc::c_int,
742        outH: *mut ::libc::c_int,
743        outW: *mut ::libc::c_int
744    ) -> cudnnStatus_t;
745
746    pub fn cudnnDestroyPoolingDescriptor(poolingDesc: cudnnPoolingDescriptor_t) -> cudnnStatus_t;
747
748    pub fn cudnnPoolingForward(
749        handle: cudnnHandle_t,
750        poolingDesc: cudnnPoolingDescriptor_t,
751        alpha: *const ::libc::c_void,
752        srcDesc: cudnnTensorDescriptor_t,
753        srcData: *const ::libc::c_void,
754        beta: *const ::libc::c_void,
755        destDesc: cudnnTensorDescriptor_t,
756        destData: *mut ::libc::c_void
757    ) -> cudnnStatus_t;
758
759    pub fn cudnnPoolingBackward(
760        handle: cudnnHandle_t,
761        poolingDesc: cudnnPoolingDescriptor_t,
762        alpha: *const ::libc::c_void,
763        srcDesc: cudnnTensorDescriptor_t,
764        srcData: *const ::libc::c_void,
765        srcDiffDesc: cudnnTensorDescriptor_t,
766        srcDiffData: *const ::libc::c_void,
767        destDesc: cudnnTensorDescriptor_t,
768        destData: *const ::libc::c_void,
769        beta: *const ::libc::c_void,
770        destDiffDesc: cudnnTensorDescriptor_t,
771        destDiffData: *mut ::libc::c_void
772    ) -> cudnnStatus_t;
773
774    pub fn cudnnActivationForward(
775        handle: cudnnHandle_t,
776        mode: cudnnActivationMode_t,
777        alpha: *const ::libc::c_void,
778        srcDesc: cudnnTensorDescriptor_t,
779        srcData: *const ::libc::c_void,
780        beta: *const ::libc::c_void,
781        destDesc: cudnnTensorDescriptor_t,
782        destData: *mut ::libc::c_void
783    ) -> cudnnStatus_t;
784
785    pub fn cudnnActivationBackward(
786        handle: cudnnHandle_t,
787        mode: cudnnActivationMode_t,
788        alpha: *const ::libc::c_void,
789        srcDesc: cudnnTensorDescriptor_t,
790        srcData: *const ::libc::c_void,
791        srcDiffDesc: cudnnTensorDescriptor_t,
792        srcDiffData: *const ::libc::c_void,
793        destDesc: cudnnTensorDescriptor_t,
794        destData: *const ::libc::c_void,
795        beta: *const ::libc::c_void,
796        destDiffDesc: cudnnTensorDescriptor_t,
797        destDiffData: *mut ::libc::c_void
798    ) -> cudnnStatus_t;
799
800    pub fn cudnnCreateLRNDescriptor(normDesc: *mut cudnnLRNDescriptor_t) -> cudnnStatus_t;
801
802    pub fn cudnnSetLRNDescriptor(
803        normDesc: cudnnLRNDescriptor_t,
804        lrnN: ::libc::c_uint,
805        lrnAlpha: ::libc::c_double,
806        lrnBeta: ::libc::c_double,
807        lrnK: ::libc::c_double
808    ) -> cudnnStatus_t;
809
810    pub fn cudnnGetLRNDescriptor(
811        normDesc: cudnnLRNDescriptor_t,
812        lrnN: *mut ::libc::c_uint,
813        lrnAlpha: *mut ::libc::c_double,
814        lrnBeta: *mut ::libc::c_double,
815        lrnK: *mut ::libc::c_double
816    ) -> cudnnStatus_t;
817
818    pub fn cudnnDestroyLRNDescriptor(lrnDesc: cudnnLRNDescriptor_t) -> cudnnStatus_t;
819
820    pub fn cudnnLRNCrossChannelForward(
821        handle: cudnnHandle_t,
822        normDesc: cudnnLRNDescriptor_t,
823        lrnMode: cudnnLRNMode_t,
824        alpha: *const ::libc::c_void,
825        srcDesc: cudnnTensorDescriptor_t,
826        srcData: *const ::libc::c_void,
827        beta: *const ::libc::c_void,
828        destDesc: cudnnTensorDescriptor_t,
829        destData: *mut ::libc::c_void
830    ) -> cudnnStatus_t;
831
832    pub fn cudnnLRNCrossChannelBackward(
833        handle: cudnnHandle_t,
834        normDesc: cudnnLRNDescriptor_t,
835        lrnMode: cudnnLRNMode_t,
836        alpha: *const ::libc::c_void,
837        srcDesc: cudnnTensorDescriptor_t,
838        srcData: *const ::libc::c_void,
839        srcDiffDesc: cudnnTensorDescriptor_t,
840        srcDiffData: *const ::libc::c_void,
841        destDesc: cudnnTensorDescriptor_t,
842        destData: *const ::libc::c_void,
843        beta: *const ::libc::c_void,
844        destDiffDesc: cudnnTensorDescriptor_t,
845        destDiffData: *mut ::libc::c_void
846    ) -> cudnnStatus_t;
847
848    pub fn cudnnDivisiveNormalizationForward(
849        handle: cudnnHandle_t,
850        normDesc: cudnnLRNDescriptor_t,
851        mode: cudnnDivNormMode_t,
852        alpha: *const ::libc::c_void,
853        srcDesc: cudnnTensorDescriptor_t,
854        srcData: *const ::libc::c_void,
855        srcMeansData:
856        *const ::libc::c_void,
857        tempData: *mut ::libc::c_void,
858        tempData2: *mut ::libc::c_void,
859        beta: *const ::libc::c_void,
860        destDesc: cudnnTensorDescriptor_t,
861        destData: *mut ::libc::c_void
862    ) -> cudnnStatus_t;
863
864    pub fn cudnnDivisiveNormalizationBackward(
865        handle: cudnnHandle_t,
866        normDesc: cudnnLRNDescriptor_t,
867        mode: cudnnDivNormMode_t,
868        alpha: *const ::libc::c_void,
869        srcDesc: cudnnTensorDescriptor_t,
870        srcData: *const ::libc::c_void,
871        srcMeansData: *const ::libc::c_void,
872        srcDiffData: *const ::libc::c_void,
873        tempData: *mut ::libc::c_void,
874        tempData2: *mut ::libc::c_void,
875        betaData: *const ::libc::c_void,
876        destDataDesc: cudnnTensorDescriptor_t,
877        destDataDiff: *mut ::libc::c_void,
878        destMeansDiff: *mut ::libc::c_void
879    ) -> cudnnStatus_t;
880
881    //pub fn cudaMalloc(devPtr: *mut cudaMemoryPtr, size: size_t) -> cudaError_t;
882
883    // pub fn cudaFree(devPtr: cudaMemoryPtr) -> cudaError_t;
884
885    // pub fn cudaMemcpy(
886    //     dst: *mut ::libc::c_void,
887    //     src: *const ::libc::c_void,
888    //     count: size_t,
889    //     kind: Enum_cudaMemcpyKind
890    // ) -> cudaError_t;
891}