summaryrefslogtreecommitdiff
path: root/thirdparty/oidn/mkl-dnn/include/mkldnn.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/oidn/mkl-dnn/include/mkldnn.h')
-rw-r--r--thirdparty/oidn/mkl-dnn/include/mkldnn.h1771
1 files changed, 1771 insertions, 0 deletions
diff --git a/thirdparty/oidn/mkl-dnn/include/mkldnn.h b/thirdparty/oidn/mkl-dnn/include/mkldnn.h
new file mode 100644
index 0000000000..9b64994922
--- /dev/null
+++ b/thirdparty/oidn/mkl-dnn/include/mkldnn.h
@@ -0,0 +1,1771 @@
+/*******************************************************************************
+* Copyright 2016-2018 Intel Corporation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*******************************************************************************/
+
+#ifndef MKLDNN_H
+#define MKLDNN_H
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+/* All symbols shall be internal unless marked as MKLDNN_API */
+#if defined _WIN32 || defined __CYGWIN__
+# define MKLDNN_HELPER_DLL_IMPORT __declspec(dllimport)
+# define MKLDNN_HELPER_DLL_EXPORT __declspec(dllexport)
+#else
+# if __GNUC__ >= 4
+# define MKLDNN_HELPER_DLL_IMPORT __attribute__ ((visibility ("default")))
+# define MKLDNN_HELPER_DLL_EXPORT __attribute__ ((visibility ("default")))
+# else
+# define MKLDNN_HELPER_DLL_IMPORT
+# define MKLDNN_HELPER_DLL_EXPORT
+# endif
+#endif
+
+#ifdef MKLDNN_DLL
+# ifdef MKLDNN_DLL_EXPORTS
+# define MKLDNN_API MKLDNN_HELPER_DLL_EXPORT
+# else
+# define MKLDNN_API MKLDNN_HELPER_DLL_IMPORT
+# endif
+#else
+# define MKLDNN_API
+#endif
+
+#if defined (__GNUC__)
+# define MKLDNN_DEPRECATED __attribute__((deprecated))
+#elif defined(_MSC_VER)
+# define MKLDNN_DEPRECATED __declspec(deprecated)
+#else
+# define MKLDNN_DEPRECATED
+#endif
+
+#include "mkldnn_types.h"
+#include "mkldnn_version.h"
+#endif /* DOXYGEN_SHOULD_SKIP_THIS */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @addtogroup c_api C API
+ * @{ */
+
+/** @addtogroup c_api_primitive Primitive operations
+ * @{ */
+
+/** @addtogroup c_api_primitive_common Common primitive operations
+ * @{ */
+
+/** Creates a primitive descriptor @p iterator for given @p op_desc, @p attr,
+ * @p engine, and optionally a hint primitive descriptor from forward
+ * propagation (required for backward propagation). Pass @c NULL for forward
+ * propagation.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_iterator_create(
+ mkldnn_primitive_desc_iterator_t *iterator,
+ const_mkldnn_op_desc_t op_desc, const_mkldnn_primitive_attr_t attr,
+ mkldnn_engine_t engine,
+ const_mkldnn_primitive_desc_t hint_forward_primitive_desc);
+
+/** Iterates over primitive descriptors. Returns #mkldnn_iterator_ends if no
+ * more primitive descriptors are available. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_iterator_next(
+ mkldnn_primitive_desc_iterator_t iterator);
+
+/** Fetches the current primitive descriptor.
+ *
+ * @note
+ * The user should delete the fetched primitive descriptor using
+ * mkldnn_primitive_desc_destroy() once it is no longer needed. */
+mkldnn_primitive_desc_t MKLDNN_API mkldnn_primitive_desc_iterator_fetch(
+ const_mkldnn_primitive_desc_iterator_t iterator);
+
+/** Deletes a primitive descriptor @p iterator */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_iterator_destroy(
+ mkldnn_primitive_desc_iterator_t iterator);
+
+/** Creates a @p primitive_desc using @p op_desc, @p attr, @p engine, and
+ * optionally a hint primitive descriptor from forward propagation. The call is
+ * equivalent to creating a primitive descriptor iterator, immediately fetching
+ * a primitive descriptor, and then destroying the iterator. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_create(
+ mkldnn_primitive_desc_t *primitive_desc,
+ const_mkldnn_op_desc_t op_desc, const_mkldnn_primitive_attr_t attr,
+ mkldnn_engine_t engine,
+ const_mkldnn_primitive_desc_t hint_forward_primitive_desc);
+
+/** Makes a copy of a @p primitive_desc. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_clone(
+ mkldnn_primitive_desc_t *primitive_desc,
+ const_mkldnn_primitive_desc_t existing_primitive_desc);
+
+/** Returns a constant reference to the attribute of a @p primitive_desc.
+ *
+ * @warning
+ * The user should not destroy the obtained @p attr.
+ *
+ * @warning
+ * The lifetime of an @p attr is the same as that of a @p primitive_desc,
+ * so it is illegal to use the @p attr once @p primitive_desc has been
+ * destroyed. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_get_attr(
+ const_mkldnn_primitive_desc_t primitive_desc,
+ const_mkldnn_primitive_attr_t *attr);
+
+/** Deletes a @p primitive_desc. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_destroy(
+ mkldnn_primitive_desc_t primitive_desc);
+
+/** Queries primitive descriptor
+ *
+ * One of the most typical use cases is to query a convolution primitive
+ * descriptor created with source, weights, and destination formats equal
+ * to #mkldnn_format_tag_any about the corresponding memory descriptors
+ * (@p what equals #mkldnn_query_src_md, #mkldnn_query_weights_md, and
+ * #mkldnn_query_dst_md respectively) to be able to prepare memory and
+ * create reorders if required.
+ *
+ * Another quite typical use case is to query an operation primitive
+ * descriptor for a workspace (@p what equals #mkldnn_query_workspace_md).
+ * The returned status #mkldnn_not_required indicates that a workspace is
+ * not required.
+ *
+ * A few other possibilities:
+ * - query an operation primitive descriptor for the underlying operation
+ * descriptor (#mkldnn_query_convolution_d, #mkldnn_query_eltwise_d,
+ * #mkldnn_query_rnn_d, etc.)
+ * - query an operation primitive descriptor for the implementation
+ * information string (#mkldnn_query_impl_info_str)
+ * - query an operation primitive descriptor for the number of inputs and
+ * outputs (#mkldnn_query_num_of_inputs_s32 and
+ * #mkldnn_query_num_of_outputs_s32 respectively)
+ *
+ * @sa mkldnn_query_t for more options
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_desc_query(
+ const_mkldnn_primitive_desc_t primitive_desc, mkldnn_query_t what,
+ int index, void *result);
+
+/** Queries primitive descriptor for memory descriptor
+ *
+ * @returns NULL in case of any error.
+ *
+ * This is just a specialized version of mkldnn_primitive_desc_query
+ * used for convenience.
+ */
+const mkldnn_memory_desc_t MKLDNN_API *mkldnn_primitive_desc_query_md(
+ const_mkldnn_primitive_desc_t primitive_desc, mkldnn_query_t what,
+ int index);
+
+/** Queries primitive descriptor for signed 32bit int
+ *
+ * @returns 0 in case of any error (in particular if the queried entity is
+ * not of type int32_t). Note that 0 might also be the actual returned
+ * value.
+ *
+ * This is just a specialized version of mkldnn_primitive_desc_query
+ * used for convenience.
+ */
+int MKLDNN_API mkldnn_primitive_desc_query_s32(
+ const_mkldnn_primitive_desc_t primitive_desc, mkldnn_query_t what,
+ int index);
+
+/** Creates a @p primitive using a @p primitive_desc descriptor. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_create(
+ mkldnn_primitive_t *primitive,
+ const_mkldnn_primitive_desc_t primitive_desc);
+
+/** Executes a @p primitive using a @p stream, and @p nargs arguments
+ * @p args. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_execute(
+ const_mkldnn_primitive_t primitive, mkldnn_stream_t stream,
+ int nargs, const mkldnn_exec_arg_t *args);
+
+/** Retrieves a reference to the @p primitive_desc descriptor of given @p
+ * primitive.
+ *
+ * @warning
+ * The returned object must not be destroyed by the user. The @c const
+ * qualifier of the returned object prevents such attempts. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_get_primitive_desc(
+ const_mkldnn_primitive_t primitive,
+ const_mkldnn_primitive_desc_t *primitive_desc);
+
+/** Deletes a @p primitive. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_destroy(
+ mkldnn_primitive_t primitive);
+
+/** @} */
+
+/** @addtogroup c_api_attributes Attributes
+ * An extension for controlling primitive behavior.
+ * @{ */
+
+/** Creates an empty (default) @p attr attribute. All the parameters are set to
+ * default values.
+ *
+ * An empty attribute is used in primitive descriptor creation whenever it
+ * is not passed explicitly, e.g. in mkldnn_primitive_desc_create.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_create(
+ mkldnn_primitive_attr_t *attr);
+
+/** Makes a copy of an @p existing_attr. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_clone(
+ mkldnn_primitive_attr_t *attr,
+ const_mkldnn_primitive_attr_t existing_attr);
+
+/** Deletes an @p attr. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_destroy(
+ mkldnn_primitive_attr_t attr);
+
+/** Returns the scratchpad @p mode set in the attribute @p attr */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_get_scratchpad_mode(
+ const_mkldnn_primitive_attr_t attr, mkldnn_scratchpad_mode_t *mode);
+
+/** Sets scratchpad @p mode.
+ *
+ * The possible values are: #mkldnn_scratchpad_mode_library (default) and
+ * #mkldnn_scratchpad_mode_user. */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_set_scratchpad_mode(
+ mkldnn_primitive_attr_t attr, mkldnn_scratchpad_mode_t mode);
+
+/** Returns @p count, correspondence scale @p mask, and a pointer to a constant
+ * floating point array of output @p scales for given @p attr, previously set
+ * by mkldnn_primitive_attr_set_output_scales.
+ *
+ * @warning
+ * The @p scales array points to the internal @p attr field, so the user
+ * should not modify or destroy @p scales.
+ *
+ * @warning
+ * The lifetime of @p scales is the same as that of the @p attr to which it
+ * belongs, so it is illegal to use @p scales after @p attr is destroyed.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_get_output_scales(
+ const_mkldnn_primitive_attr_t attr, mkldnn_dim_t *count, int *mask,
+ const float **scales);
+
+/** Sets output @p scales for primitive operations. The number of elements @p
+ * count and correspondence scale @p mask are stored for future use.
+ *
+ * The @p mask argument defines the correspondence between the output tensor
+ * dimensions and the @p scales array. Set the i-th bit of @p mask to 1 to use a
+ * dedicated scaling factor for each slice of the output tensor over the i-th
+ * dimension. Set @p mask to 0 to use a common scaling factor for the whole
+ * output tensor.
+ *
+ * @note
+ * The dimension order is always native and does not depend on the actual
+ * layout used. Examples:
+ * - 2D dimensional data the order of dimensions is always: (n, c)
+ * - 4D dimensional data the order is always: (n, c, h, w)
+ * - 5D dimensional weights the order is always: (g, oc, ic, kh, kw)
+ *
+ * Example usage:
+ * @code
+ * int mb = 32, oc = 32, oh = 14, ow = 14; // convolution output params
+ * float scales[oc] = { ... }; // unique output scales per output channel
+ * int oc_dim = 1; // mb_dim = 0, channel_dim = 1, height_dim = 2, ...
+ *
+ * mkldnn_convolution_desc_t cd; // create & configure convolution op_desc
+ *
+ * mkldnn_primitive_attr_t attr;
+ * mkldnn_primitive_attr_create(&attr); // create default attributes
+ * mkldnn_primitive_attr_set_output_scales(attr, oc, 1 << oc_dim, scales);
+ *
+ * mkldnn_primitive_desc_t cpd;
+ * mkldnn_primitive_desc_create(&cpd, &cd, attr, NULL);
+ * @endcode
+ *
+ * @note
+ * There is no way to check that @p count corresponds to @p mask until an
+ * actual primitive descriptor is created, so it is the user's
+ * responsibility to set proper values. The following formula must hold:
+ *
+ * \f[count = \prod\limits_{d \in mask} output.dims[d]\f]
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_set_output_scales(
+ mkldnn_primitive_attr_t attr, mkldnn_dim_t count, int mask,
+ const float *scales);
+
+/** Returns @p post_ops for given @p attr.
+ *
+ * @warning
+ * @p post_ops points to the internal @p attr field, so the user should not
+ * modify or destroy @p post_ops. Also, the lifetime of @p post_ops is the
+ * same as that of the @p attr it belongs to, so it is illegal to use @p
+ * post_ops after @p attr has been destroyed.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_get_post_ops(
+ const_mkldnn_primitive_attr_t attr, const_mkldnn_post_ops_t *post_ops);
+
+/** Sets configured @p post_ops to an attribute @p attr for future use (when
+ * primitive descriptor is being created).
+ *
+ * @note
+ * At this point in time, there is no way to check whether the primitive
+ * descriptor does or does not support a given sequence of post operations.
+ * Therefore the user should handle an error that might occur at the
+ * mkldnn_primitive_desc_create call.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_set_post_ops(
+ mkldnn_primitive_attr_t attr, const_mkldnn_post_ops_t post_ops);
+
+/** @addtogroup c_api_attributes_post_ops Sequence of post operations
+ * An extension for performing extra operations after a base operation.
+ * @{ */
+
+/** Creates an empty sequence of post operations @p post_ops. */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_create(mkldnn_post_ops_t *post_ops);
+
+/** Deletes a @p post_ops sequence. */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_destroy(mkldnn_post_ops_t post_ops);
+
+/** Returns the @p length of post operations for given @p post_ops. */
+int MKLDNN_API mkldnn_post_ops_len(const_mkldnn_post_ops_t post_ops);
+
+/** Returns the type of post operation with index @p index in given
+ * @p post_ops. In case of error, returns #mkldnn_undefined_primitive. */
+mkldnn_primitive_kind_t MKLDNN_API mkldnn_post_ops_get_kind(
+ const_mkldnn_post_ops_t post_ops, int index);
+
+/** Appends accumulation (sum) post operation to the @p post_ops. Prior to
+ * accumulating the result, the previous value would be multiplied by @p scale.
+ *
+ * The kind of this post operation is #mkldnn_sum.
+ *
+ * This feature might improve performance for cases like residual learning
+ * blocks, where the result of convolution is accumulated to the previously
+ * computed activations. The parameter @p scale might be extreme for the
+ * integer-based computations when the result and previous activations have
+ * different logical scaling factors.
+ *
+ * In the simplest case when the accumulation is the only post operation, the
+ * computations would be:
+ * dst[] <- scale * dst[] + op(...) // instead of dst[] <- op(...)
+ *
+ * @note
+ * This post operation (as well as all the others) disregards the original
+ * layout of the destination; that is, the layout of the original
+ * destination is expected to be the same as the layout of the stored
+ * destination.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_append_sum(
+ mkldnn_post_ops_t post_ops, float scale);
+
+/** Gets the parameters of the accumulation (sum) post operation with index
+ * @p index in the sequence of @p post_ops.
+ *
+ * @note
+ * If index @p index would not correspond to the accumulation post
+ * operation, the function returns #mkldnn_invalid_arguments.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_get_params_sum(
+ const_mkldnn_post_ops_t post_ops, int index, float *scale);
+
+/** Appends eltwise post operation to the @p post_ops with given parameters
+ * @p kind, @p alpha, and @p beta (@sa mkldnn_eltwise_forward_desc_init and
+ * mkldnn_eltwise_desc_t).
+ *
+ * The kind of this post operation is #mkldnn_eltwise.
+ *
+ * In the simplest case when the eltwise is the only post operation, the
+ * computations would be:
+ * dst[] <- scale * eltwise_op ( op(...) ) // instead of dst[] <- op(...)
+ * where eltwise_op is configured with the given parameters.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_append_eltwise(
+ mkldnn_post_ops_t post_ops, float scale, mkldnn_alg_kind_t alg,
+ float alpha, float beta);
+
+/** Gets the eltwise parameters of the post operation with index @p index in
+ * the sequence of @p post_ops.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_post_ops_get_params_eltwise(
+ const_mkldnn_post_ops_t post_ops, int index, float *scale,
+ mkldnn_alg_kind_t *alg, float *alpha, float *beta);
+
+/** @} */
+
+/** @} */
+
+/** @addtogroup c_api_memory Memory
+ * A primitive to describe and store data.
+ *
+ * The library supports various data types and formats. Memory hierarchy
+ * consists of three levels of abstraction:
+ * 1. **Memory descriptor** -- engine agnostic logical description of data
+ * (number of dimensions, dimensions themselves, and data type), and
+ * optionally the format/layout that describes the physical representation
+ * of data in memory. If the format is not known yet, one can pass
+ * #mkldnn_format_tag_any. This approach is used to allow compute-intensive
+ * primitives to specify the most appropriate format on their own with
+ * users required to reorder the data if the incoming format doesn't match
+ * the primitive's selection. Memory descriptor can be initialized with
+ * mkldnn_memory_desc_init_by_tag() or mkldnn_memory_desc_init_by_strides()
+ * functions, or by directly filling the mkldnn_memory_desc_t structure.
+ * The latter requires deep knowledge of how the physical data
+ * representation is mapped to the structure.
+ * The @ref understanding_memory_formats topic should shed some light on
+ * that.
+ * For the fully defined memory descriptors (i.e. where the format kind is
+ * not equal to #mkldnn_format_kind_any) a user can the size, using the
+ * mkldnn_memory_desc_get_size() function. As described in
+ * @ref understanding_memory_formats, the size of data sometimes cannot
+ * be computed as the product of dimensions times the size of the data
+ * type. So users are encouraged to use this function for better code
+ * portability.
+ * Two memory descriptors can be compared with mkldnn_memory_desc_equal().
+ * The comparison is especially useful when checking whether a primitive
+ * requires reorder from the user's data format to the primitive's format.
+ * 2. **Memory** -- an engine-specific object that handles the data and its
+ * description (a memory descriptor). For CPU enigne, the data handle is
+ * simply a pointer to @c void. The data handle can be queried using
+ * mkldnn_memory_get_data_handle() and set using
+ * mkldnn_memory_set_data_handle(). The latter function always sets the
+ * memory in the padding region to zero, which is the invariant maintained
+ * by all the primitives in Intel MKL-DNN.
+ * See @ref understanding_memory_formats for more details.
+ * A memory can be created using mkldnn_memory_create() function.
+ * A memory can also be queried for the underlying memory descriptor and
+ * engine using mkldnn_memory_get_memory_desc() and
+ * mkldnn_memory_get_engine() functions.
+ *
+ * Along with ordinary memory with all dimensions being positive, Intel
+ * MKL-DNN supports *zero-volume* memory with one or more dimensions set to
+ * zero. This is to support the NumPy\* convention.
+ * If a *zero-volume* memory is passed to a primitive, the primitive does
+ * not perform any computations on this memory. For example:
+ * - Convolution with `(0 batch, 3 input channels, 13 height, 13 width)`
+ * source and `(16 output channels, 3 inputs, channel, 3 height, 3 width)`
+ * weights would produce `(0 batch, 16 output channels, 11 height, 11 width)`
+ * destination (assuming strides are `1` and paddings are zero) and perform
+ * zero multiply-add operations.
+ * - Concatenation of three memories of shapes `(3, 4, 13, 13)`,
+ * `(3, 0, 13, 13)`, and `(3, 1, 13, 13)` along the second axis would produce
+ * the output of the shape `(3, 5, 13, 13)`, effectively ignoring the second
+ * input (however, if the user created a concatenation primitive descriptor
+ * with three inputs they should also provide all three memories to the
+ * concatenation primitive, including the one with zero second dimension).
+ * - However, Intel MKL-DNN would return an error when attempting to create a
+ * convolution with *zero-volume* memory passed for weights because such a
+ * convolution is not well-defined:
+ * ~~~
+ * dst(1, 16, 11, 11) <-- src(1, 0, 13, 13) (*) wei(16, 0, 3, 3)
+ * ~~~
+ * Should the values in the destination be zeroes or just not accessed at
+ * all? Moreover, backward pass w.r.t. weights in such cases is also not
+ * well-defined.
+ *
+ * Data handle of *zero-volume* memory is never accessed and hence can be
+ * unset (NULL in case of CPU engine).
+ *
+ * @sa @ref understanding_memory_formats
+ * @{ */
+
+/** Initializes a @p memory_desc memory descriptor using @p ndims, @p dims, @p
+ * data_type, and @p strides.
+ *
+ * The @p strides might be NULL, which means the order of physical dimensions
+ * is the same as the order of logical ones.
+ *
+ * @note The logical order of dimensions is defined by a primitive that
+ * consumes the memory.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_memory_desc_init_by_strides(
+ mkldnn_memory_desc_t *memory_desc, int ndims, const mkldnn_dims_t dims,
+ mkldnn_data_type_t data_type, const mkldnn_dims_t strides);
+
+/** Initializes a @p memory_desc memory descriptor using @p ndims, @p dims, @p
+ * data_type, and format @p tag.
+ *
+ * @p tag can be #mkldnn_format_tag_any, which allows a primitive to define
+ * the appropriate memory format. In this case, the @p format_kind would be set
+ * to #mkldnn_format_kind_any */
+mkldnn_status_t MKLDNN_API mkldnn_memory_desc_init_by_tag(
+ mkldnn_memory_desc_t *memory_desc, int ndims, const mkldnn_dims_t dims,
+ mkldnn_data_type_t data_type, mkldnn_format_tag_t tag);
+
+/** Initializes a @p memory_desc for a given @p parent_memory_desc, with
+ * @p dims sizes and @p offsets. May fail if layout used does not allow
+ * obtain desired submemory. In this case consider using `extract` or `insert`
+ * primitive */
+mkldnn_status_t MKLDNN_API mkldnn_memory_desc_init_submemory(
+ mkldnn_memory_desc_t *memory_desc,
+ const mkldnn_memory_desc_t *parent_memory_desc,
+ const mkldnn_dims_t dims, const mkldnn_dims_t offsets);
+
+/** Compares two memory descriptors.
+ * @return 1 if the descriptors are the same.
+ * @return 0 if the descriptors are different.
+ *
+ * Use this function to identify whether a reorder is required between the
+ * two memories */
+int MKLDNN_API mkldnn_memory_desc_equal(
+ const mkldnn_memory_desc_t *lhs,
+ const mkldnn_memory_desc_t *rhs);
+
+/** Returns the size (in bytes) that is required for given @p memory_desc */
+size_t MKLDNN_API mkldnn_memory_desc_get_size(
+ const mkldnn_memory_desc_t *memory_desc);
+
+/** Creates a memory for given @p memory_desc and @p engine. Also sets handle
+ * to @p native_handle.
+ * The @p native_handle can:
+ * - point to the user allocated memory, i.e. valid handle. In this case the
+ * library doesn't own allocated memory.
+ * - be MKLDNN_NATIVE_HANDLE_ALLOCATE to ask the library to allocate and
+ * attach memory. In this case the library owns allocated memory.
+ * - be MKLDNN_NATIVE_HANDLE_NONE to create mkldnn_memory w/o attached memory.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_memory_create(mkldnn_memory_t *memory,
+ const mkldnn_memory_desc_t *memory_desc, mkldnn_engine_t engine,
+ void *native_handle);
+
+/** Returns a @p memory_desc associated with @p memory. */
+mkldnn_status_t MKLDNN_API mkldnn_memory_get_memory_desc(
+ const_mkldnn_memory_t memory,
+ const mkldnn_memory_desc_t **memory_desc);
+
+/** Returns an @p engine associated with @p memory. */
+mkldnn_status_t MKLDNN_API mkldnn_memory_get_engine(
+ const_mkldnn_memory_t memory, mkldnn_engine_t *engine);
+
+/** For a @p memory, returns the data @p handle.
+ *
+ * For the CPU engine, the data handle is a pointer to the actual data. */
+mkldnn_status_t MKLDNN_API mkldnn_memory_get_data_handle(
+ const_mkldnn_memory_t memory, void **handle);
+
+/** For a @p memory, sets the data @p handle. */
+mkldnn_status_t MKLDNN_API mkldnn_memory_set_data_handle(
+ mkldnn_memory_t memory, void *handle);
+
+/** Deletes a @p memory. */
+mkldnn_status_t MKLDNN_API mkldnn_memory_destroy(mkldnn_memory_t memory);
+
+/** @} */
+
+/** @addtogroup c_api_reorder Reorder
+ * A primitive to copy data between memory formats.
+ * @{ */
+
+/** Initializes a @p reorder_primitive_desc using the description of the source
+ * (@p src_engine and @p src_md) and destination (@p dst_engine and @p dst_md)
+ * memory, and an @p attr attribute.
+ *
+ * Inputs:
+ * - input (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - output (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_reorder_primitive_desc_create(
+ mkldnn_primitive_desc_t *reorder_primitive_desc,
+ mkldnn_engine_t src_engine, const mkldnn_memory_desc_t *src_md,
+ mkldnn_engine_t dst_engine, const mkldnn_memory_desc_t *dst_md,
+ const_mkldnn_primitive_attr_t attr);
+
+/** @} */
+
+/** @addtogroup c_api_concat Concat
+ * A primitive to concatenate data by arbitrary dimension.
+ * @{ */
+
+/** Creates out-of-place @p concat_primitive_desc for concatenation of @p n
+ * inputs by @p concat_dimension with resulting @p output_desc memory
+ * descriptor. @p output_desc can be NULL or specified with the
+ * #mkldnn_format_kind_any format kind -- in this case, the appropriate memory
+ * format would be chosen automatically.
+ *
+ * Inputs:
+ * - input 0 (#mkldnn_query_src_md, 0)
+ * - input 1 (#mkldnn_query_src_md, 1)
+ * - ...
+ * - input @p n - 1 (#mkldnn_query_src_md, @p n - 1)
+ *
+ * Outputs:
+ * - output (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_concat_primitive_desc_create(
+ mkldnn_primitive_desc_t *concat_primitive_desc,
+ const mkldnn_memory_desc_t *dst_md,
+ int n, int concat_dimension,
+ const mkldnn_memory_desc_t *src_mds,
+ const_mkldnn_primitive_attr_t attr,
+ mkldnn_engine_t engine);
+
+/** @} */
+
+/** @addtogroup c_api_sum Sum
+ * A primitive to sum data.
+ * @{ */
+
+/** Creates out-of-place @p sum_primitive_desc for sum of @p n
+ * inputs multiplied by scale with resulting @p output_desc memory
+ * descriptor. @p output_desc can be NULL or specified with the
+ * #mkldnn_format_kind_any format kind -- in this case, the appropriate memory
+ * format would be chosen automatically.
+ *
+ * Inputs:
+ * - src 0 (#mkldnn_query_src_md, 0)
+ * - src 1 (#mkldnn_query_src_md, 1)
+ * - ...
+ * - src @p n - 1 (#mkldnn_query_src_md, @p n - 1)
+ *
+ * Outputs:
+ * - output (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_sum_primitive_desc_create(
+ mkldnn_primitive_desc_t *sum_primitive_desc,
+ const mkldnn_memory_desc_t *dst_mds,
+ int n, const float *scales,
+ const mkldnn_memory_desc_t *src_mds,
+ const_mkldnn_primitive_attr_t attr,
+ mkldnn_engine_t engine);
+
+/** @} */
+
+/** @addtogroup c_api_convolution Convolution
+ * A primitive to compute convolution using different algorithms.
+ *
+ * \f[dst[n][oc][oh][ow] =
+ * \sum_{kw=0}^{KW}\sum_{kh=0}^{KH}\sum_{ic=0}^{IC}
+ * src[n][ic][oh \cdot s_h - p_l[0] + kh][ow \cdot s_w - p_r[1] + kw]
+ * \cdot weights[g][oc][ic][kh][kw]
+ * + bias[g][oc],\f]
+ *
+ * where size of output spatial domain is given by
+ * \f$ OH = \left\lfloor{\frac{IH - KH + p_l[0] + p_r[0]}{s_h}}
+ * \right\rfloor + 1\f$,
+ * \f$ OW = \left\lfloor{\frac{IW - KW + p_l[1] + p_r[1]}{s_w}}
+ * \right\rfloor + 1\f$,
+ *
+ * and summation is carried over input channels \f$ic\f$ in
+ * group \f$g\f$, and \f$s_h, s_w\f$ are @p strides and
+ * \f$p_l, p_r\f$ are @p padding_l and @p padding_r.
+ * @{ */
+
+/** Initializes a convolution descriptor @p conv_desc for forward propagation
+ * using @p prop_kind (possible values are #mkldnn_forward_training and
+ * #mkldnn_forward_inference), @p alg_kind, memory descriptors, @p strides, @p
+ * padding_l, @p padding_r, and @p padding_kind. In order to create a
+ * convolution without bias, @p bias_desc should either be @c NULL or point to
+ * a descriptor with memory format kind equal to #mkldnn_format_kind_undef.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ * - bias (#mkldnn_query_weights_md, 1), if created with bias
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_convolution_forward_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a dilated convolution descriptor @p conv_desc for forward
+ * propagation using @p prop_kind (possible values are #mkldnn_forward_training
+ * and #mkldnn_forward_inference), @p alg_kind, memory descriptors, @p strides,
+ * @p dilates, @p padding_l, @p padding_r, and @p padding_kind.
+ * In order to create a dilated convolution without bias, @p bias_desc
+ * should either be @c NULL or point to a descriptor with memory format kind
+ * equals #mkldnn_format_kind_undef.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ * - bias (#mkldnn_query_weights_md, 1), if created with bias
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_dilated_convolution_forward_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a convolution descriptor @p conv_desc for backward propagation
+ * with respect to data using @p alg_kind, memory descriptors, @p strides, @p
+ * padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_convolution_backward_data_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a dilated convolution descriptor @p conv_desc for backward
+ * propagation with respect to data using @p alg_kind, memory descriptors, @p
+ * strides, @p dilates @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_dilated_convolution_backward_data_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a convolution descriptor @p conv_desc for backward propagation
+ * with respect to weights using @p alg_kind, memory descriptors, @p strides,
+ * @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_weights (#mkldnn_query_diff_weights_md, 0)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 1), if created with bias
+ */
+mkldnn_status_t MKLDNN_API mkldnn_convolution_backward_weights_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *diff_weights_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a convolution descriptor @p conv_desc for backward propagation
+ * with respect to weights using @p alg_kind, memory descriptors, @p strides,
+ * @p dilates @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_weights (#mkldnn_query_diff_weights_md, 0)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 1), if created with bias
+ */
+mkldnn_status_t MKLDNN_API
+mkldnn_dilated_convolution_backward_weights_desc_init(
+ mkldnn_convolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *diff_weights_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** @} */
+
+/** @addtogroup c_api_deconvolution Deconvolution
+ * A primitive to compute deconvolution using different algorithms.
+ *
+ * @{ */
+
+
+/** Initializes a deconvolution descriptor @p deconv_desc for forward
+ * propagation using @p prop_kind (possible values are #mkldnn_forward_training
+ * and #mkldnn_forward_inference), @p alg_kind, memory descriptors, @p strides,
+ * @p padding_l, @p padding_r, and @p padding_kind. In order to create a
+ * deconvolution without bias, @p bias_desc should either be @c NULL or point to
+ * a descriptor with memory format kind equals #mkldnn_format_kind_undef.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ * - bias (#mkldnn_query_weights_md, 1), if created with bias
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_deconvolution_forward_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a dilated deconvolution descriptor @p deconv_desc for forward
+ * propagation using @p prop_kind (possible values are #mkldnn_forward_training
+ * and #mkldnn_forward_inference), @p alg_kind, memory descriptors, @p strides,
+ * @p dilates, @p padding_l, @p padding_r, and @p padding_kind. In order to
+ * create a dilated deconvolution without bias, @p bias_desc should either be
+ * @c NULL or point to a descriptor with memory format kind equal
+ * #mkldnn_format_kind_undef.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ * - bias (#mkldnn_query_weights_md, 1), if created with bias
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_dilated_deconvolution_forward_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a deconvolution descriptor @p conv_desc for backward propagation
+ * with respect to data using @p alg_kind, memory descriptors, @p strides, @p
+ * padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_deconvolution_backward_data_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a dilated deconvolution descriptor @p conv_desc for backward
+ * propagation with respect to data using @p alg_kind, memory descriptors, @p
+ * strides, @p dilates, @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_dilated_deconvolution_backward_data_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a deconvolution descriptor @p conv_desc for backward propagation
+ * with respect to weights using @p alg_kind, memory descriptors, @p strides,
+ * @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_weights (#mkldnn_query_diff_weights_md, 0)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 1), if created with bias
+ */
+mkldnn_status_t MKLDNN_API mkldnn_deconvolution_backward_weights_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *diff_weights_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t padding_l, const mkldnn_dims_t padding_r,
+ mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a dilated deconvolution descriptor @p conv_desc for backward
+ * propagation with respect to weights using @p alg_kind, memory descriptors,
+ * @p strides, @p dilates, @p padding_l, @p padding_r, and @p padding_kind.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_weights (#mkldnn_query_diff_weights_md, 0)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 1), if created with bias
+ */
+mkldnn_status_t MKLDNN_API mkldnn_dilated_deconvolution_backward_weights_desc_init(
+ mkldnn_deconvolution_desc_t *conv_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *diff_weights_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t dilates, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** @} */
+
+/** @addtogroup c_api_shuffle Shuffle
+ * A primitive to shuffle data along the axis.
+ * @{ */
+
+/** Initializes a @p shuffle_desc for forward propagation using @p prop_kind,
+ * memory descriptor @p data_desc, @p axis, and @p group_size.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ *
+ */
+mkldnn_status_t MKLDNN_API mkldnn_shuffle_forward_desc_init(
+ mkldnn_shuffle_desc_t *shuffle_desc, mkldnn_prop_kind_t prop_kind,
+ const mkldnn_memory_desc_t *data_desc, int axis,
+ mkldnn_dim_t group_size);
+
+/** Initializes a @p shuffle_desc for backward propagation using memory
+ * descriptor @p diff_data_desc, @p axis, and @p group_size.
+ *
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ *
+ */
+mkldnn_status_t MKLDNN_API mkldnn_shuffle_backward_desc_init(
+ mkldnn_shuffle_desc_t *shuffle_desc,
+ const mkldnn_memory_desc_t *diff_data_desc, int axis,
+ mkldnn_dim_t group_size);
+
+/** @} */
+
+/** @addtogroup c_api_eltwise Eltwise
+ * A primitive to compute element-wise operations like parametric rectifier
+ * linear unit (ReLU).
+ *
+ * Both forward and backward passes support in-place operation; that is, src
+ * and dst point to the same memory for forward pass, and diff_dst and diff_src
+ * point to the same memory for backward pass.
+ *
+ * @warning Because the original src is required for backward pass, in-place
+ * forward pass in general cannot be applied during training. However, for some
+ * kinds of element-wise operations (namely ReLU with alpha parameter equals 0),
+ * dst and src can be interchangeable for the backward pass, which enables
+ * performing in-place forward even for training.
+ *
+ * @{ */
+
+/** Initializes an @p eltwise_desc for forward propagation using @p prop_kind
+ * (possible values are #mkldnn_forward_training and #mkldnn_forward_inference),
+ * @p alg_kind algorithm, memory descriptor @p data_desc, @p alpha, and
+ * @p beta parameters.
+ *
+ * @sa mkldnn_eltwise_desc_t for details.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_eltwise_forward_desc_init(
+ mkldnn_eltwise_desc_t *eltwise_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *data_desc,
+ float alpha, float beta);
+
+/** Initializes an @p eltwise_desc for backward propagation using @p alg_kind
+ * algorithm memory descriptors @p diff_data_desc and @p data_desc, and the
+ * @p alpha and @p beta parameters.
+ *
+ * @sa mkldnn_eltwise_desc_t for details.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_eltwise_backward_desc_init(
+ mkldnn_eltwise_desc_t *eltwise_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_data_desc,
+ const mkldnn_memory_desc_t *data_desc, float alpha, float beta);
+
+/** @} */
+
+/** @addtogroup c_api_softmax Softmax
+ * A primitive to perform softmax.
+ *
+ * \f[dst[u][c][in] =
+ * \frac{\exp(src[ou][c][in]) - \max\limits_{c}(src[ou][c][in])}
+ * {\sum\limits_{c}\{\exp(src[ou][c][in])
+ * - \max\limits_{c}(src[ou][c][in])\}},\f]
+ *
+ * where \f$ou, iu\f$ are outer and inner sizes repectively, defined
+ * by @p data_desc.dims and @p softmax_axis.
+ * @{ */
+
+/** Initializes a @p softmax_desc for forward propagation using @p prop_kind
+ * (possible values are #mkldnn_forward_training and #mkldnn_forward_inference)
+ * and memory descriptor @p data_desc.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_softmax_forward_desc_init(
+ mkldnn_softmax_desc_t *softmax_desc, mkldnn_prop_kind_t prop_kind,
+ const mkldnn_memory_desc_t *data_desc, int softmax_axis);
+
+/** Initializes a @p softmax_desc for backward propagation using memory
+ * descriptors @p diff_desc and @p data_desc.
+ *
+ * Inputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_softmax_backward_desc_init(
+ mkldnn_softmax_desc_t *softmax_desc,
+ const mkldnn_memory_desc_t *diff_desc,
+ const mkldnn_memory_desc_t *data_desc, int softmax_axis);
+
+/** @} */
+
+/** @addtogroup c_api_pooling Pooling
+ * A primitive to perform max or average pooling.
+ *
+ * Max pooling:
+ * \f[dst[n][oc][oh][ow] =
+ * \max\limits_{kw,kh}
+ * (src[n][ic][oh \cdot s_h - p_l[0] + kh][ow \cdot s_w - p_r[1] + kw]),\f]
+ *
+ * Average pooling:
+ * \f[dst[n][oc][oh][ow] =
+ * \frac{1}{KW \cdot KH}\sum\limits_{kw,kh}
+ * src[n][ic][oh \cdot s_h - p_l[0] + kh][ow \cdot s_w - p_r[1] + kw],\f]
+ *
+ * where \f$p_l, p_r\f$ are @p padding_l and @p padding_r respectively, and
+ * output spatial dimensions are calculated similarly to how they are done in
+ * convolution.
+ *
+ * During training, max pooling requires a workspace on forward
+ * (#mkldnn_forward_training) and backward (#mkldnn_backward) passes to
+ * save indices where maximum was found. The workspace layout is opaque, and
+ * the indices cannot be restored from it. However, one can use backward
+ * pooling to perform up-sampling (used in some detection topologies).
+ *
+ * @{ */
+
+/** Initializes a pooling descriptor @p pool_desc for forward propagation using
+ * @p prop_kind (possible values are #mkldnn_forward_training and
+ * #mkldnn_forward_inference), @p alg_kind, memory descriptors, and pooling
+ * parameters in the spatial domain: @p strides, @p kernel sizes, @p padding_l,
+ * @p padding_r, and @p padding_kind.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if @p alg_kind = #mkldnn_pooling_max and
+ * @p prop_kind = #mkldnn_forward_training
+ */
+mkldnn_status_t MKLDNN_API mkldnn_pooling_forward_desc_init(
+ mkldnn_pooling_desc_t *pool_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t kernel, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** Initializes a pooling descriptor @p pool_desc for backward propagation
+ * using @p alg_kind, memory descriptors, and pooling parameters in the spatial
+ * domain: @p strides, @p kernel sizes, @p padding_l, @p padding_r, and @p
+ * padding_kind.
+ *
+ * @note If @p padding_r is @c NULL, the padding is supposed to be symmetric.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if @p alg_kind = #mkldnn_pooling_max
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_pooling_backward_desc_init(
+ mkldnn_pooling_desc_t *pool_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc, const mkldnn_dims_t strides,
+ const mkldnn_dims_t kernel, const mkldnn_dims_t padding_l,
+ const mkldnn_dims_t padding_r, mkldnn_padding_kind_t padding_kind);
+
+/** @} */
+
+/** @addtogroup c_api_lrn LRN
+ * A primitive to perform local response normalization (LRN) across or within
+ * channels.
+ *
+ * LRN accross channels:
+ * \f[dst[n][c][h][w] = \left\{k + \frac{\alpha}{n_{l}}
+ * \sum\limits_{i=-(n_{l}-1)/2}^{(n_{l}+1)/2}
+ * (src[n][c+i][h][w])^2\right\}^{-\beta}
+ * src[n][c][h][w],\f]
+ *
+ * LRN within channels:
+ * \f[dst[n][c][h][w] = \left\{k + \frac{\alpha}{n_{l}}
+ * \sum\limits_{i=-(n_{l}-1)/2}^{(n_{l}+1)/2}
+ * (src[n][c][h+i][w+i])^2\right\}^{-\beta}
+ * src[n][c][h][w],\f]
+ *
+ * where \f$n_{l}\f$ is the @p local_size.
+ *
+ * During training, LRN might or might not require a workspace on forward
+ * (#mkldnn_forward_training) and backward (#mkldnn_backward) passes. The
+ * behavior is implementation specific. Optimized implementations typically
+ * require a workspace and use it to save some intermediate results from the
+ * forward pass that accelerate computations on the backward pass.
+ *
+ * To check whether a workspace is required, query the LRN primitive descriptor
+ * for the workspace (#mkldnn_query_workspace_md). Success indicates that the
+ * workspace is required and its description will be returned.
+ * @sa mkldnn_primitive_desc_query and mkldnn_primitive_desc_query_pd
+ *
+ * @{ */
+
+/** Initializes an @p lrn_desc for forward propagation using @p prop_kind
+ * (possible values are #mkldnn_forward_training and #mkldnn_forward_inference),
+ * @p alg_kind, memory descriptor @p data_desc, and regularization
+ * parameters @p local_size, @p alpha, @p beta, and @p k.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if the underlying implementation requires
+ */
+mkldnn_status_t MKLDNN_API mkldnn_lrn_forward_desc_init(
+ mkldnn_lrn_desc_t *lrn_desc, mkldnn_prop_kind_t prop_kind,
+ mkldnn_alg_kind_t alg_kind, const mkldnn_memory_desc_t *data_desc,
+ mkldnn_dim_t local_size, float alpha, float beta, float k);
+
+/** Initializes an @p lrn_desc for backward propagation using @p alg_kind,
+ * memory descriptors @p data_desc and @p diff_data_desc, and regularization
+ * parameters @p local_size, @p alpha, @p beta, and @p k.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if the underlying implementation requires
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_lrn_backward_desc_init(
+ mkldnn_lrn_desc_t *lrn_desc, mkldnn_alg_kind_t alg_kind,
+ const mkldnn_memory_desc_t *diff_data_desc,
+ const mkldnn_memory_desc_t *data_desc, mkldnn_dim_t local_size,
+ float alpha, float beta, float k);
+
+/** @} */
+
+/** @addtogroup c_api_batch_normalization Batch Normalization
+ * A primitive to perform batch normalization.
+ *
+ * \f[dst[n][c][h][w] = \gamma[c] \frac{src[n][c][h][w] - \mu[c]}
+ * {\sqrt{\sigma[c] + eps}} + \beta[c],\f]
+ *
+ * where \f$\gamma[c], \beta[c]\f$ are weights and bias for a channel and,
+ *
+ * \f$\mu[c] = \frac{1}{NHW} \sum\limits_{whn} src[n][c][h][w]\f$,
+ * \f$\sigma[c] = \frac{1}{NHW} \sum\limits_{whn}
+ * (src[n][c][h][w] - \mu[c])^2\f$,
+ *
+ * and @c eps is a constant to improve numerical stability.
+ *
+ * Both forward and backward passes support in-place operation; that is, src
+ * and dst point to the same memory for forward pass, and diff_dst and diff_src
+ * point to the same memory for backward pass.
+ *
+ * Batch normalization supports different flavors controlled by
+ * mkldnn_batch_normalization_desc_t. For example, batch normalization can
+ * compute the mean and variance on its own or take them as inputs. It can
+ * either perform scaling and shifting using gamma and beta parameters or not.
+ * Optionally it can also perform a fused ReLU, which in case of training would
+ * also require a workspace.
+ *
+ * @sa mkldnn_batch_normalization_desc_t
+ * @{ */
+
+/** Initializes a batch normalization descriptor @p bnrm_desc for forward
+ * propagation using @p prop_kind (possible values are
+ * #mkldnn_forward_training and #mkldnn_forward_inference), memory descriptor
+ * @p data_desc, normalization parameter @p epsilon, and @p flags set using bit
+ * flags of type mkldnn_batch_normalization_desc_t.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - mean (#mkldnn_query_src_md, 1),
+ * if #mkldnn_use_global_stats bit-flags is set in @p flags
+ * - variance (#mkldnn_query_src_md, 2),
+ * if #mkldnn_use_global_stats bit-flags is set in @p flags
+ * - scale_and_shift (#mkldnn_query_weights_md, 0),
+ * if #mkldnn_use_scaleshift bit-flags is set in @p flags
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ * - mean (#mkldnn_query_dst_md, 1),
+ * if #mkldnn_use_global_stats bit-flags is not set in @p flags
+ * @p prop_kind = #mkldnn_forward_training
+ * - variance (#mkldnn_query_dst_md, 2),
+ * if #mkldnn_use_global_stats bit-flags is not set in @p flags
+ * and @p prop_kind = #mkldnn_forward_training
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if #mkldnn_fuse_bn_relu bit-flags is set in @p flags
+ * and @p prop_kind = #mkldnn_forward_training
+ *
+ * @note In-place operation is supported; that is, dst points to the same memory
+ * as src.
+ *
+ * @sa mkldnn_batch_normalization_desc_t
+ */
+mkldnn_status_t MKLDNN_API mkldnn_batch_normalization_forward_desc_init(
+ mkldnn_batch_normalization_desc_t *bnrm_desc,
+ mkldnn_prop_kind_t prop_kind, const mkldnn_memory_desc_t *data_desc,
+ float epsilon, unsigned flags);
+
+/** Initializes a batch normalization descriptor @p bnrm_desc for backward
+ * propagation with respect to data and scale-shift parameters using memory
+ * descriptors @p data_desc and @p diff_data_desc, normalization parameter
+ * @p epsilon, and @p flags set using bit flags of type
+ * mkldnn_batch_normalization_desc_t.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - mean (#mkldnn_query_src_md, 1)
+ * - variance (#mkldnn_query_src_md, 2)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - scale_and_shift (#mkldnn_query_weights_md, 0),
+ * if #mkldnn_use_scaleshift bit-flags is set in @p flags
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if #mkldnn_fuse_bn_relu bit-flags is set in @p flags
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ * - diff_scale_and_shift (#mkldnn_query_diff_weights_md, 0),
+ * if #mkldnn_use_scaleshift bit-flags is set in @p flags
+ * and @p prop_kind = #mkldnn_backward
+ *
+ * @note in-place operation is supported,
+ * i.e. diff_src points to the same memory as diff_dst.
+ *
+ * @sa mkldnn_batch_normalization_desc_t
+ */
+mkldnn_status_t MKLDNN_API mkldnn_batch_normalization_backward_desc_init(
+ mkldnn_batch_normalization_desc_t *bnrm_desc,
+ mkldnn_prop_kind_t prop_kind,
+ const mkldnn_memory_desc_t *diff_data_desc,
+ const mkldnn_memory_desc_t *data_desc,
+ float epsilon, unsigned flags);
+
+/** @} */
+
+/** @addtogroup c_api_inner_product Inner product
+ * A primitive to compute an inner product.
+ *
+ * Inner product layer is also known as fully connected layer.
+ * With spatial dimension:
+ *
+ * \f[dst[n][oc] = \sum\limits_{ic, kh, kw}
+ * src[n][ic][kh][kw] \cdot weights[oc][ic][kh][kw]
+ * + bias[oc]\f]
+ * @{ */
+
+/** Initializes an inner product descriptor @p ip_desc for forward propagation
+ * using @p prop_kind (possible values are #mkldnn_forward_training and
+ * #mkldnn_forward_inference) and memory descriptors. In order to create an
+ * inner product without bias, @p bias_desc should be either @c NULL or a
+ * pointer to a descriptor with memory format kind equals
+ * #mkldnn_format_kind_undef.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ * - bias (#mkldnn_query_weights_md, 1), if created with bias
+ *
+ * Outputs:
+ * - dst (#mkldnn_query_dst_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_inner_product_forward_desc_init(
+ mkldnn_inner_product_desc_t *ip_desc, mkldnn_prop_kind_t prop_kind,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_desc);
+
+/** Initializes an inner product descriptor @p ip_desc for backward propagation
+ * with respect to data using memory descriptors.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ * - weights (#mkldnn_query_weights_md, 0)
+ *
+ * Outputs:
+ * - diff_src (#mkldnn_query_diff_src_md, 0)
+ */
+mkldnn_status_t MKLDNN_API mkldnn_inner_product_backward_data_desc_init(
+ mkldnn_inner_product_desc_t *ip_desc,
+ const mkldnn_memory_desc_t *diff_src_desc,
+ const mkldnn_memory_desc_t *weights_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc);
+
+/** Initializes an inner product descriptor @p ip_desc for backward propagation
+ * with respect to weights using memory descriptors.
+ *
+ * @note Memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src (#mkldnn_query_src_md, 0)
+ * - diff_dst (#mkldnn_query_diff_dst_md, 0)
+ *
+ * Outputs:
+ * - diff_weights (#mkldnn_query_diff_weights_md, 0)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 1), if created with bias
+ */
+mkldnn_status_t MKLDNN_API mkldnn_inner_product_backward_weights_desc_init(
+ mkldnn_inner_product_desc_t *ip_desc,
+ const mkldnn_memory_desc_t *src_desc,
+ const mkldnn_memory_desc_t *diff_weights_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_desc);
+
+/** @} */
+
+/** @addtogroup c_api_rnn RNN
+ * A primitive to compute the common recurrent layer.
+ * @todo add additional description for the group
+ * @{ */
+
+/**
+ * Initializes a recurrent cell descriptor @p rnn_cell_desc
+ * using @p rnn_cell_desc, @p kind (possible values are
+ * #mkldnn_vanilla_rnn, #mkldnn_vanilla_lstm, #mkldnn_vanilla_gru, and
+ * #mkldnn_gru_linear_before_reset),
+ * @p f (possible values are #mkldnn_eltwise_relu and
+ * #mkldnn_eltwise_tanh), @p flags, @p alpha, and @p clipping.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_rnn_cell_desc_init(
+ mkldnn_rnn_cell_desc_t *rnn_cell_desc,
+ mkldnn_alg_kind_t kind, mkldnn_alg_kind_t f,
+ unsigned int flags, float alpha, float clipping);
+
+/** Returns the number of gates of a particular @p rnn_cell_desc. */
+int MKLDNN_API mkldnn_rnn_cell_get_gates_count(
+ const mkldnn_rnn_cell_desc_t *rnn_cell_desc);
+
+/** Returns the number of states of a particular @p rnn_cell_desc. */
+int MKLDNN_API mkldnn_rnn_cell_get_states_count(
+ const mkldnn_rnn_cell_desc_t *rnn_cell_desc);
+
+/** Sets quantization @p scale and @p shift for RNN data tensors.
+ * For performance reasons, low precision configuration of RNN primitive
+ * expects input activations to have unsigned int8 data type. Scale and shift
+ * used to quantize floating point data to unsigned integer must be passed to
+ * RNN primitive using attributes.
+ * Example usage:
+ * @code
+ * // rnn parameters
+ * int l = 2, t = 2, mb = 32, sic = 32, slc = 32, dic = 32, dlc = 32;
+ * // activations quantization parameters
+ * float scale = ..., shift = ..;
+ *
+ * mkldnn_primitive_attr_t rnn_attr;
+ * // create default attributes
+ * mkldnn_primitive_attr_create(&rnn_attr);
+ *
+ * // set scale and shift for int8 quantization of activation
+ * mkldnn_primitive_attr_set_rnn_data_qparams(rnn_attr, scale, shift);
+ *
+ * // create & configure rnn op_desc
+ * mkldnn_rnn_desc_t rnn_d;
+ * mkldnn_primitive_desc_t rnn_pd;
+ * mkldnn_primitive_desc_create(&rnn_pd, &rnn_d, attr, engine, NULL);
+ * @endcode
+ * @note
+ * Quantization scale and shift are common for src_layer, src_iter,
+ * dst_iter and dst_layer.
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_set_rnn_data_qparams(
+ mkldnn_primitive_attr_t attr, const float scale, const float shift);
+
+/** Sets quantization scales @p weights_scales for RNN weights tensors.
+ * Low precision configuration of RNN primitive expects input weights to have
+ * signed int8 data type. Scales used to quantize floating point data
+ * to signed integer must be passed to RNN primitive using attributes.
+ * The @p mask argument defines correspondence between output tensor dimensions
+ * and the @p weights_scales array. Set i-th bit of @p mask to 1 to use
+ * dedicated scaling factor for each slice of the output tensor over i-th
+ * dimension. Set @p mask to 0 to use common scaling factor for the whole output
+ * tensor. Example usage:
+ * @code
+ * // rnn parameters
+ * int l = 2, t = 2, mb = 32, sic = 32, slc = 32, dic = 32, dlc = 32;
+ * // unique output scales per output channel
+ * float weights_scales[dic * n_gates] = { ... };
+ * // mask that specifies last two dimensions of ldigo format
+ * int mask = 0x3;
+ *
+ * mkldnn_primitive_attr_t attr;
+ * // create default attributes
+ * mkldnn_primitive_attr_create(&attr);
+ *
+ * // set output channel-wise weights scales
+ * mkldnn_primitive_attr_set_rnn_weights_qparams(attr, dic * n_gates, mask,
+ * weights_scales);
+ *
+ * // create & configure rnn op_desc
+ * mkldnn_rnn_desc_t rnn_d;
+ * mkldnn_primitive_desc_t rnn_pd;
+ * mkldnn_primitive_desc_create(&rnn_pd, &rnn_d, attr, engine, NULL);
+ * @endcode
+ * @note
+ * The dimension order is always native and does not depend on the actual
+ * layout used. For example, 5 dimensional weights always have
+ * (l, d, i, g, o) logical dimension ordering.
+ * @note
+ * Quantization sales are common for weights_layer and weights_iteration
+ * @note
+ * There is no way to check that @p count corresponds to @p mask until an
+ * actual primitive descriptor is created, so it is user's responsibility
+ * to set proper values. The following formula must be held:
+ *
+ * \f[count = \prod\limits_{d \in mask} output.dims[d]\f]
+ */
+mkldnn_status_t MKLDNN_API mkldnn_primitive_attr_set_rnn_weights_qparams (
+ mkldnn_primitive_attr_t attr, mkldnn_dim_t count, int mask,
+ const float *weights_scales);
+
+/** Initializes a rnn descriptor @p rnn_desc for forward propagation
+ * using @p prop_kind, @p rnn_cell_desc, @p direction, and memory descriptors.
+ * @note If @p prop_kind equals #mkldnn_forward_training, you must query a
+ * workspace memory descriptor before creating the primitive.
+ *
+ * @p src_iter_desc, @p bias_desc, and @p dst_iter_desc are allowed to either be
+ * @c NULL or point to a zero memory descriptor, which would indicate that the
+ * RNN primitive should not use them.
+ *
+ * @note All memory descriptors except @p src_iter_desc are allowed to be
+ * initialized with #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * Inputs:
+ * - src_layer (#mkldnn_query_src_md, 0)
+ * - src_iter (#mkldnn_query_src_md, 1), if used
+ * - weights_layer (#mkldnn_query_weights_md, 0)
+ * - weights_iter (#mkldnn_query_weights_md, 1)
+ * - bias (#mkldnn_query_weights_md, 2), if used
+ *
+ * Outputs:
+ * - dst_layer (#mkldnn_query_dst_md, 0)
+ * - dst_iter (#mkldnn_query_dst_md, 1), if used
+ * - workspace (#mkldnn_query_workspace_md, 0),
+ * if @p prop_kind equals #mkldnn_forward_training
+ */
+mkldnn_status_t MKLDNN_API mkldnn_rnn_forward_desc_init(
+ mkldnn_rnn_desc_t *rnn_desc, mkldnn_prop_kind_t prop_kind,
+ const mkldnn_rnn_cell_desc_t *rnn_cell_desc,
+ const mkldnn_rnn_direction_t direction,
+ const mkldnn_memory_desc_t *src_layer_desc,
+ const mkldnn_memory_desc_t *src_iter_desc,
+ const mkldnn_memory_desc_t *weights_layer_desc,
+ const mkldnn_memory_desc_t *weights_iter_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_layer_desc,
+ const mkldnn_memory_desc_t *dst_iter_desc);
+
+/** Initializes a rnn descriptor @p rnn_desc for backward propagation
+ * using @p prop_kind, @p rnn_cell_desc, @p direction, and memory descriptors.
+ *
+ * @note All memory descriptors are allowed to be initialized with
+ * #mkldnn_format_kind_any value of @p format_kind.
+ *
+ * @p src_iter_desc (simultaneously with @p diff_src_iter_desc),
+ * @p bias_desc (simultaneously with @p diff_bias_desc), and
+ * @p dst_iter_desc (simultaneously with @p diff_src_iter_desc) are allowed to
+ * either be @c NULL or point to a zero memory descriptor, which would indicate
+ * that the RNN primitive should not use them.
+ *
+ * Inputs:
+ * - src_layer (#mkldnn_query_src_md, 0)
+ * - src_iter (#mkldnn_query_src_md, 1), if used
+ * - weights_layer (#mkldnn_query_weights_md, 0)
+ * - weights_iter (#mkldnn_query_weights_md, 1)
+ * - bias (#mkldnn_query_weights_md, 2), if used
+ * - dst_layer (#mkldnn_query_dst_md, 0)
+ * - dst_iter (#mkldnn_query_dst_md, 1), if used
+ * - diff_dst_layer (#mkldnn_query_diff_dst_md, 0)
+ * - diff_dst_iter (#mkldnn_query_diff_dst_md, 1), if used
+ * - workspace (#mkldnn_query_workspace_md, 0)
+ *
+ * Outputs:
+ * - diff_src_layer (#mkldnn_query_diff_src_md, 0)
+ * - diff_src_iter (#mkldnn_query_diff_src_md, 1), if used
+ * - diff_weights_layer (#mkldnn_query_diff_weights_md, 0)
+ * - diff_weights_iter (#mkldnn_query_diff_weights_md, 1)
+ * - diff_bias (#mkldnn_query_diff_weights_md, 2), if used
+ */
+mkldnn_status_t MKLDNN_API mkldnn_rnn_backward_desc_init(
+ mkldnn_rnn_desc_t *rnn_desc, mkldnn_prop_kind_t prop_kind,
+ const mkldnn_rnn_cell_desc_t *rnn_cell_desc,
+ const mkldnn_rnn_direction_t direction,
+ const mkldnn_memory_desc_t *src_layer_desc,
+ const mkldnn_memory_desc_t *src_iter_desc,
+ const mkldnn_memory_desc_t *weights_layer_desc,
+ const mkldnn_memory_desc_t *weights_iter_desc,
+ const mkldnn_memory_desc_t *bias_desc,
+ const mkldnn_memory_desc_t *dst_layer_desc,
+ const mkldnn_memory_desc_t *dst_iter_desc,
+ const mkldnn_memory_desc_t *diff_src_layer_desc,
+ const mkldnn_memory_desc_t *diff_src_iter_desc,
+ const mkldnn_memory_desc_t *diff_weights_layer_desc,
+ const mkldnn_memory_desc_t *diff_weights_iter_desc,
+ const mkldnn_memory_desc_t *diff_bias_desc,
+ const mkldnn_memory_desc_t *diff_dst_layer,
+ const mkldnn_memory_desc_t *diff_dst_iter_desc);
+
+/** @} */
+
+/** @} */
+
+/** @addtogroup c_api_engine Engine operations
+ * @{ */
+
+/** Returns the number of engines of a particular @p kind. */
+size_t MKLDNN_API mkldnn_engine_get_count(mkldnn_engine_kind_t kind);
+
+/** Creates an @p engine of particular @p kind and @p index. */
+mkldnn_status_t MKLDNN_API mkldnn_engine_create(mkldnn_engine_t *engine,
+ mkldnn_engine_kind_t kind, size_t index);
+
+/** Returns the kind of an @p engine. */
+mkldnn_status_t MKLDNN_API mkldnn_engine_get_kind(mkldnn_engine_t engine,
+ mkldnn_engine_kind_t *kind);
+
+/** Destroys an @p engine. */
+mkldnn_status_t MKLDNN_API mkldnn_engine_destroy(mkldnn_engine_t engine);
+
+/** @} */
+
+/** @addtogroup c_api_stream Execution stream operations
+ * @{ */
+
+/** Creates an execution @p stream for @p engine and with @p flags. */
+mkldnn_status_t MKLDNN_API mkldnn_stream_create(mkldnn_stream_t *stream,
+ mkldnn_engine_t engine, unsigned flags);
+
+/** Destroys an execution @p stream. */
+mkldnn_status_t MKLDNN_API mkldnn_stream_destroy(mkldnn_stream_t stream);
+
+/** @} */
+
+/** @addtogroup c_api_service Service functions
+ * @{ */
+
+/** Sets verbosity level (print information to stdout).
+ * Possible levels are:
+ * - 0 -- no verbose output (default)
+ * - 1 -- primitive information at execution
+ * - 2 -- primitive information at creation and execution
+ *
+ * @note
+ * Dumping information might affect performance.
+ * This setting overrides the MKLDNN_VERBOSE environment variable. */
+mkldnn_status_t MKLDNN_API mkldnn_set_verbose(int level);
+
+/** Enables or disables dumping of JIT-generated code.
+ * The enable parameter can be:
+ * - 0 -- disable
+ * - any other value -- enable
+ *
+ * @note
+ * This setting overrides the MKLDNN_JIT_DUMP environment variable. */
+mkldnn_status_t MKLDNN_API mkldnn_set_jit_dump(int enable);
+
+/** Gets library version information.
+ * Version information includes:
+ * - major -- major version number
+ * - minor -- minor version number
+ * - patch -- patch release number
+ * - hash -- git commit hash */
+const mkldnn_version_t MKLDNN_API *mkldnn_version();
+
+/** @} */
+
+/** @addtogroup c_api_blas BLAS functions
+ * A subset of Basic Linear ALgebra (BLAS) functions to perform
+ * matrix-matrix multiplication.
+ * @{ */
+
+/** SGEMM performs a matrix-matrix multiplication operation defined as
+ *
+ * C := alpha*op( A )*op( B ) + beta*C
+ *
+ * where
+ * - op( X ) is one of op( X ) = X or op( X ) = X**T,
+ * - alpha and beta are scalars,
+ * - A, B and C are matrices, with op( A ) an m by k matrix, op( B ) a k by n matrix
+ * and C an m by n matrix.
+ *
+ * The matrices are assumed to be stored in column-major order (the elements
+ * in a matrix columns are contiguous in memory).
+ *
+ * @note
+ * The API is different from the standard BLAS routine
+ * because it returns mkldnn_status_t for error handling.
+ * XERBLA is not supported: no error message will be printed
+ * in case of incorrect parameters. */
+mkldnn_status_t MKLDNN_API mkldnn_sgemm(
+ const char *transa, const char *transb,
+ const mkldnn_dim_t *M, const mkldnn_dim_t *N, const mkldnn_dim_t *K,
+ const float *alpha, const float *A, const mkldnn_dim_t *lda,
+ const float *B, const mkldnn_dim_t *ldb,
+ const float *beta, float *C, const mkldnn_dim_t *ldc);
+
+/** gemm_s8u8s32 and gemm_s8s8s32 perform a matrix-matrix multiplication
+ * operation and add the result to a scalar-matrix product. For the final
+ * result, a vector is added to each row or column of the output matrix.
+ * The operation is defined as:
+ *
+ * C := alpha*(op(A) + A_offset) * (op(B) + B_offset) + beta*C + C_offset
+ *
+ * where
+ * - op( X ) = X or op( X ) = X**T,
+ * - A_offset is an m-by-k matrix with every element equal to the value oa,
+ * - B_offset is an k-by-n matrix with every element equal to the value ob,
+ * - C_offset is an m-by-n matrix defined by the oc array, size len:
+ * - if offsetc = F: len must be at least 1
+ * - if offsetc = C: len must be at least max(1, m)
+ * - if offsetc = R: len must be at least max(1, n)
+ * - alpha and beta are scalars, and A, B and C are matrices, with op( A )
+ * an m-by-k matrix, op( B ) a k-by-n matrix and C an m-by-n matrix.
+ *
+ * The matrices are assumed to be stored in column-major order (the elements
+ * in a matrix columns are contiguous in memory).
+ *
+ * @note
+ * The API is different compared with the standard BLAS routine
+ * because it returns mkldnn_status_t for error handling.
+ * XERBLA is not supported: no error message will be printed
+ * in case of incorrect parameters. */
+mkldnn_status_t MKLDNN_API mkldnn_gemm_s8u8s32(
+ const char *transa, const char *transb, const char *offsetc,
+ const mkldnn_dim_t *M, const mkldnn_dim_t *N, const mkldnn_dim_t *K,
+ const float *alpha,
+ const int8_t *A, const mkldnn_dim_t *lda, const int8_t *ao,
+ const uint8_t *B, const mkldnn_dim_t *ldb, const int8_t *bo,
+ const float *beta,
+ int32_t *c, const mkldnn_dim_t *ldc, const int32_t *co);
+
+mkldnn_status_t MKLDNN_API mkldnn_gemm_s8s8s32(
+ const char *transa, const char *transb, const char *offsetc,
+ const mkldnn_dim_t *M, const mkldnn_dim_t *N, const mkldnn_dim_t *K,
+ const float *alpha,
+ const int8_t *A, const mkldnn_dim_t *lda, const int8_t *ao,
+ const int8_t *B, const mkldnn_dim_t *ldb, const int8_t *bo,
+ const float *beta,
+ int32_t *c, const mkldnn_dim_t *ldc, const int32_t *co);
+/** @} */
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif