def get_pool2d_desc(ksize, stride, pad, mode): """Create a 2d pooling descriptor.""" desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor(desc, libcudnn.cudnnPoolingMode[mode], ksize[0], ksize[1], pad[0], pad[1], stride[0], stride[1]) return Auto(desc, libcudnn.cudnnDestroyPoolingDescriptor)
def get_pool2d_desc(ksize, stride, pad, mode): """Create a 2d pooling descriptor.""" desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor( desc, libcudnn.cudnnPoolingMode[mode], ksize[0], ksize[1], pad[0], pad[1], stride[0], stride[1]) return Auto(desc, libcudnn.cudnnDestroyPoolingDescriptor)
def configure(self, input): in_images = input.shape[0] in_channels = input.shape[1] in_height = input.shape[2] in_width = input.shape[3] assert(in_width >= self.kW) assert(in_height >= self.kH) out_width = int((math.floor(1.0 * in_width - self.kW + 2*self.padW) / self.dW) + 1) out_height = int((math.floor(1.0 * in_height - self.kH + 2*self.padH) / self.dH) + 1) self.output = GPUTensor( (in_images, in_channels, out_height, out_width), input.dtype ) if self.pool_desc: libcudnn.cudnnDestroyPoolingDescriptor(self.pool_desc) if self.in_desc: libcudnn.cudnnDestroyTensorDescriptor(self.in_desc) if self.out_desc: libcudnn.cudnnDestroyTensorDescriptor(self.out_desc) self.in_desc = input.get_cudnn_tensor_desc() self.out_desc = self.output.get_cudnn_tensor_desc() self.pool_desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor(self.pool_desc, libcudnn.cudnnPoolingMode["CUDNN_POOLING_MAX"], # libcudnn.cudnnNanPropagation["CUDNN_NOT_PROPAGATE_NAN"], self.kH, self.kW, self.padH, self.padW, self.dH, self.dW)
def configure(self, input): in_images = input.shape[0] in_channels = input.shape[1] in_height = input.shape[2] in_width = input.shape[3] assert (in_width >= self.kW) assert (in_height >= self.kH) out_width = int((math.floor(1.0 * in_width - self.kW + 2 * self.padW) / self.dW) + 1) out_height = int( (math.floor(1.0 * in_height - self.kH + 2 * self.padH) / self.dH) + 1) self.output = GPUTensor( (in_images, in_channels, out_height, out_width), input.dtype) if self.pool_desc: libcudnn.cudnnDestroyPoolingDescriptor(self.pool_desc) if self.in_desc: libcudnn.cudnnDestroyTensorDescriptor(self.in_desc) if self.out_desc: libcudnn.cudnnDestroyTensorDescriptor(self.out_desc) self.in_desc = input.get_cudnn_tensor_desc() self.out_desc = self.output.get_cudnn_tensor_desc() self.pool_desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor( self.pool_desc, libcudnn.cudnnPoolingMode["CUDNN_POOLING_MAX"], # libcudnn.cudnnNanPropagation["CUDNN_NOT_PROPAGATE_NAN"], self.kH, self.kW, self.padH, self.padW, self.dH, self.dW)
kH = 2 dW = 1 dH = 1 padW = 0 padH = 0 in_width = x.shape[3] in_height = x.shape[2] out_width = int((math.floor(1.0 * in_width - kW + 2 * padW) / dW) + 1) out_height = int((math.floor(1.0 * in_height - kH + 2 * padH) / dH) + 1) print("Ot:", out_width, out_height) y = GPUTensor((1, 1, out_height, out_width)) y_desc = y.get_cudnn_tensor_desc() print(y_desc) pool_desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor( pool_desc, libcudnn.cudnnPoolingMode["CUDNN_POOLING_MAX"], kH, kW, padH, padW, dH, dW) alpha = 1.0 beta = 0.0 libcudnn.cudnnPoolingForward(cudnn_context, pool_desc, alpha, x_desc.ptr, x.get_gpu_voidp(), beta, y_desc.ptr, y.get_gpu_voidp()) print("SHAPE:", y_desc.shape) print(y.get())
kH = 2 dW = 1 dH = 1 padW = 0 padH = 0 in_width = x.shape[3] in_height = x.shape[2] out_width = int((math.floor(1.0 * in_width - kW + 2*padW) / dW) + 1) out_height = int((math.floor(1.0 * in_height - kH + 2*padH) / dH) + 1) print("Ot:", out_width, out_height) y = GPUTensor((1,1,out_height, out_width)) y_desc = y.get_cudnn_tensor_desc() print(y_desc) pool_desc = libcudnn.cudnnCreatePoolingDescriptor() libcudnn.cudnnSetPooling2dDescriptor(pool_desc, libcudnn.cudnnPoolingMode["CUDNN_POOLING_MAX"], kH, kW, padH, padW, dH, dW) alpha = 1.0 beta = 0.0 libcudnn.cudnnPoolingForward(cudnn_context, pool_desc, alpha, x_desc.ptr, x.get_gpu_voidp(), beta, y_desc.ptr, y.get_gpu_voidp()) print("SHAPE:", y_desc.shape) print(y.get())