.. index:: pair: page; Reduction .. _doxid-dev_guide_reduction: Reduction ========= :ref:`API Reference ` General ~~~~~~~ The reduction primitive performs reduction operation on arbitrary data. Each element in the destination is the result of reduction operation with specified algorithm along one or multiple source tensor dimensions: .. math:: \dst(f) = \mathop{reduce\_op}\limits_{r}\src(r), where :math:`reduce\_op` can be max, min, sum, mul, mean, Lp-norm and Lp-norm-power-p, :math:`f` is an index in an idle dimension and :math:`r` is an index in a reduction dimension. Mean: .. math:: \dst(f) = \frac{\sum\limits_{r}\src(r)} {R}, where :math:`R` is the size of a reduction dimension. Lp-norm: .. math:: \dst(f) = \root p \of {\mathop{eps\_op}(\sum\limits_{r}|src(r)|^p, eps)}, where :math:`eps\_op` can be max and sum. Lp-norm-power-p: .. math:: \dst(f) = \mathop{eps\_op}(\sum\limits_{r}|src(r)|^p, eps), where :math:`eps\_op` can be max and sum. Notes ----- * The reduction primitive requires the source and destination tensors to have the same number of dimensions. * Reduction dimensions are of size 1 in a destination tensor. * The reduction primitive does not have a notion of forward or backward propagations. Execution Arguments ~~~~~~~~~~~~~~~~~~~ When executed, the inputs and outputs should be mapped to an execution argument index as specified by the following table. ============================== ================================================================================================================================================================= Primitive input/output Execution argument index ============================== ================================================================================================================================================================= :math:`\src` DNNL_ARG_SRC :math:`\dst` DNNL_ARG_DST :math:`\text{binary post-op}` :ref:`DNNL_ARG_ATTR_MULTIPLE_POST_OP(binary_post_op_position) ` | DNNL_ARG_SRC_1 ============================== ================================================================================================================================================================= Implementation Details ~~~~~~~~~~~~~~~~~~~~~~ General Notes ------------- * The :math:`\dst` memory format can be either specified explicitly or by :ref:`dnnl::memory::format_tag::any ` (recommended), in which case the primitive will derive the most appropriate memory format based on the format of the source tensor. Post-Ops and Attributes ----------------------- The following attributes are supported: ======== ================================================================================== ===================================================================================== ==================================== Type Operation Description Restrictions ======== ================================================================================== ===================================================================================== ==================================== Post-op :ref:`Sum ` Adds the operation result to the destination tensor instead of overwriting it. Post-op :ref:`Eltwise ` Applies an :ref:`Eltwise ` operation to the result. Post-op :ref:`Binary ` Applies a :ref:`Binary ` operation to the result General binary post-op restrictions ======== ================================================================================== ===================================================================================== ==================================== Data Types Support ------------------ The source and destination tensors may have ``f32``, ``bf16``, ``f16`` or ``int8`` data types. See :ref:`Data Types ` page for more details. Data Representation ------------------- Sources, Destination ++++++++++++++++++++ The reduction primitive works with arbitrary data tensors. There is no special meaning associated with any of the dimensions of a tensor. Implementation Limitations ~~~~~~~~~~~~~~~~~~~~~~~~~~ #. Refer to :ref:`Data Types ` for limitations related to data types support. #. GPU * Only tensors of 6 or fewer dimensions are supported. Performance Tips ~~~~~~~~~~~~~~~~ #. Whenever possible, avoid specifying different memory formats for source and destination tensors. Example ~~~~~~~ :ref:`Reduction Primitive Example ` This C++ API example demonstrates how to create and execute a :ref:`Reduction ` primitive.