/*cudnn set tensor dim*/ void setTensorDesc(cudnnTensorDescriptor_t& tensorDesc, cudnnTensorFormat_t& tensorFormat, cudnnDataType_t& dataType, int n, int c, int h, int w){ #if SIMPLE_TENSOR_DESCRIPTOR /*cudnn set 4d tensor*/ checkCUDNN(cudnnSetTensor4dDescriptor(tensorDesc, tensorFormat, dataType, n, c, h, w)); #elif defined(ND_TENSOR_DESCRIPTOR) const int nDim = 4; int dimA[nDim] = {n,c,h,w}; int strideA[nDim] = {c*h*w, h*w, w, 1}; checkCUDNN(cudnnSetTensorNdDescriptor(tensorDesc, dataType, 4, dimA, strideA)); #else checkCUDNN(cudnnSetTensor4dDescriptorEx(tensorDesc, dataType, n, c, h, w, c*h*w, h*w, w, 1)); #endif }
static int c_set_tensor4d(CudaNdarray *var, cudnnTensorDescriptor_t desc) { cudnnStatus_t err = cudnnSetTensor4dDescriptorEx( desc, CUDNN_DATA_FLOAT, CudaNdarray_HOST_DIMS(var)[0], CudaNdarray_HOST_DIMS(var)[1], CudaNdarray_HOST_DIMS(var)[2], CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[0]?CudaNdarray_HOST_STRIDES(var)[0]:CudaNdarray_HOST_DIMS(var)[2]*CudaNdarray_HOST_DIMS(var)[3]*CudaNdarray_HOST_DIMS(var)[1], CudaNdarray_HOST_STRIDES(var)[1]?CudaNdarray_HOST_STRIDES(var)[1]:CudaNdarray_HOST_DIMS(var)[2]*CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[2]?CudaNdarray_HOST_STRIDES(var)[2]:CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[3]?CudaNdarray_HOST_STRIDES(var)[3]:1 ); if (err != CUDNN_STATUS_SUCCESS) { PyErr_Format(PyExc_RuntimeError, "Could not set tensor4d descriptor: %s" "shapes=%d %d %d %d strides=%d %d %d %d", cudnnGetErrorString(err), CudaNdarray_HOST_DIMS(var)[0], CudaNdarray_HOST_DIMS(var)[1], CudaNdarray_HOST_DIMS(var)[2], CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[0]?CudaNdarray_HOST_STRIDES(var)[0]:CudaNdarray_HOST_DIMS(var)[2]*CudaNdarray_HOST_DIMS(var)[3]*CudaNdarray_HOST_DIMS(var)[1], CudaNdarray_HOST_STRIDES(var)[1]?CudaNdarray_HOST_STRIDES(var)[1]:CudaNdarray_HOST_DIMS(var)[2]*CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[2]?CudaNdarray_HOST_STRIDES(var)[2]:CudaNdarray_HOST_DIMS(var)[3], CudaNdarray_HOST_STRIDES(var)[3]?CudaNdarray_HOST_STRIDES(var)[3]:1 ); return -1; } return 0; }
inline void createTensor4dDesc(cudnnTensorDescriptor_t* desc, Size size, Stride stride) { CUDNN_CHECK(cudnnCreateTensorDescriptor(desc)); CUDNN_CHECK(cudnnSetTensor4dDescriptorEx(*desc, dataType<Dtype>::type, size.num(), size.channels(), size.height(), size.width(), stride.nstride(), stride.cstride(), stride.hstride(), stride.wstride())); }
inline void setTensor4dDesc(cudnnTensorDescriptor_t* desc, int n, int c, int h, int w, int stride_n, int stride_c, int stride_h, int stride_w) { CUDNN_CHECK(cudnnSetTensor4dDescriptorEx(*desc, dataType<Dtype>::type, n, c, h, w, stride_n, stride_c, stride_h, stride_w)); }