/****************************************************************************** * Copyright (c) Intel Corporation - All rights reserved. * * This file is part of the LIBXSMM library. * * * * For information on the license, see the LICENSE file. * * Further information: https://github.com/hfp/libxsmm/ * * SPDX-License-Identifier: BSD-3-Clause * ******************************************************************************/ /* Alexander Heinecke (Intel Corp.) ******************************************************************************/ #ifndef LIBXSMM_DNN_CONVOLUTION_H #define LIBXSMM_DNN_CONVOLUTION_H #include "libxsmm_dnn.h" #include "libxsmm_dnn_tensor.h" #include "libxsmm_dnn_fusedbatchnorm.h" /** Opaque handles which represents convolutions and LIBXSMM datatypes */ LIBXSMM_EXTERN_C typedef struct LIBXSMM_RETARGETABLE libxsmm_dnn_layer libxsmm_dnn_layer; typedef enum libxsmm_dnn_conv_fuse_op { /* we fuse nothing into convolution */ LIBXSMM_DNN_CONV_FUSE_NONE = 0 } libxsmm_dnn_conv_fuse_op; /** Type of algorithm used for convolutions. */ typedef enum libxsmm_dnn_conv_algo { /** let the library decide */ LIBXSMM_DNN_CONV_ALGO_AUTO, /** direct convolution. */ LIBXSMM_DNN_CONV_ALGO_DIRECT } libxsmm_dnn_conv_algo; /** Structure which describes the input and output of data (DNN). */ LIBXSMM_EXTERN_C typedef struct LIBXSMM_RETARGETABLE libxsmm_dnn_conv_desc { int N; /* number of images in mini-batch */ int C; /* number of input feature maps */ int H; /* height of input image */ int W; /* width of input image */ int K; /* number of output feature maps */ int R; /* height of filter kernel */ int S; /* width of filter kernel */ int u; /* vertical stride */ int v; /* horizontal stride */ int pad_h; /* height of logical rim padding to input for adjusting output height */ int pad_w; /* width of logical rim padding to input for adjusting output width */ int pad_h_in; /* height of zero-padding in input buffer, must equal to pad_h for direct conv */ int pad_w_in; /* width of zero-padding in input buffer, must equal to pad_w for direct conv */ int pad_h_out; /* height of zero-padding in output buffer */ int pad_w_out; /* width of zero-padding in output buffer */ int threads; /* number of threads to use when running convolution */ libxsmm_dnn_datatype datatype_in; /* datatypes used for all input related buffer */ libxsmm_dnn_datatype datatype_out; /* datatypes used for all output related buffer */ libxsmm_dnn_tensor_format buffer_format; /* format which is for buffer buffers */ libxsmm_dnn_tensor_format filter_format; /* format which is for filter buffers */ libxsmm_dnn_conv_algo algo; /* convolution algorithm used */ libxsmm_dnn_conv_option options; /* additional options */ libxsmm_dnn_conv_fuse_op fuse_ops; /* used ops into convolutions */ } libxsmm_dnn_conv_desc; /** Create a layer handle (non-NULL if successful), and pre-build all JIT-code versions. */ LIBXSMM_API libxsmm_dnn_layer* libxsmm_dnn_create_conv_layer(libxsmm_dnn_conv_desc conv_desc, libxsmm_dnn_err_t* status); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_destroy_conv_layer(const libxsmm_dnn_layer* handle); /** get layout description of buffers and filters from handle */ LIBXSMM_API libxsmm_dnn_tensor_datalayout* libxsmm_dnn_create_tensor_datalayout(const libxsmm_dnn_layer* handle, const libxsmm_dnn_tensor_type type, libxsmm_dnn_err_t* status); /** scratch pad management */ LIBXSMM_API size_t libxsmm_dnn_get_scratch_size(const libxsmm_dnn_layer* handle, const libxsmm_dnn_compute_kind kind, libxsmm_dnn_err_t* status); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_bind_scratch(libxsmm_dnn_layer* handle, const libxsmm_dnn_compute_kind kind, const void* scratch); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_release_scratch(libxsmm_dnn_layer* handle, const libxsmm_dnn_compute_kind kind); /** Bind/Release buffers, filters and bias to layer operation */ LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_bind_tensor(libxsmm_dnn_layer* handle, const libxsmm_dnn_tensor* tensor, const libxsmm_dnn_tensor_type type); LIBXSMM_API libxsmm_dnn_tensor* libxsmm_dnn_get_tensor(libxsmm_dnn_layer* handle, const libxsmm_dnn_tensor_type type, libxsmm_dnn_err_t* status); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_release_tensor(libxsmm_dnn_layer* handle, const libxsmm_dnn_tensor_type type); /** Run the layer identified by the handle; may use threads internally. */ LIBXSMM_API void libxsmm_dnn_execute(libxsmm_dnn_layer* handle, libxsmm_dnn_compute_kind kind); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_execute_st(libxsmm_dnn_layer* handle, libxsmm_dnn_compute_kind kind, /*unsigned*/int start_thread, /*unsigned*/int tid); /** some helper functions for framework integration */ LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_trans_reg_filter(const libxsmm_dnn_layer* handle); LIBXSMM_API libxsmm_dnn_err_t libxsmm_dnn_trans_reg_bf16_filter(const libxsmm_dnn_layer* handle); #endif /*LIBXSMM_DNN_CONVOLUTION_H*/