The binary primitive computes the result of a binary elementwise operation between tensors source 0 and source 1 (the variable names follow the standard Naming Conventions):
\[ \dst(\overline{x}) = \src_0(\overline{x}) \mathbin{op} \src_1(\overline{x}), \]
where \(op\) is addition, subtraction, multiplication, division, get maximum value or get minimum value.
The binary primitive does not have a notion of forward or backward propagations.
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 

\(\src_0\)  DNNL_ARG_SRC_0 
\(\src_1\)  DNNL_ARG_SRC_1 
\(\dst\)  DNNL_ARG_DST 
\(binary postop\)  DNNL_ARG_ATTR_MULTIPLE_POST_OP(binary_post_op_position)  DNNL_ARG_SRC_1 
The following attributes are supported:
Type  Operation  Description  Res 

Attribute  Scales  Scales the corresponding input tensor by the given scale factor(s).  The corresponding tensor has integer data type. Only one scale per tensor is supported. Input tensors only. 
Postop  Sum  Adds the operation result to the destination tensor instead of overwriting it.  
Postop  Eltwise  Applies an Eltwise operation to the result.  
Postop  Binary  Applies a Binary operation to the result  General binary postop restrictions 
The source and destination tensors may have f32
, bf16
, or int8
data types. The binary primitive supports the following combinations of data types:
Source 0 / 1  Des 

f32  f32 
bf16  bf16 
f16  f16 
s8, u8, f32  s8, u8 
s8, u8, f32  s8, u8 
The binary primitive works with arbitrary data tensors. There is no special meaning associated with any of tensors dimensions.
Engine  Name  Com 

CPU/GPU  Binary Primitive Example  This C++ API example demonstrates how to create and execute a Binary primitive. Key optimizations included in this example:
