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, 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 post-op\) | DNNL_ARG_ATTR_MULTIPLE_POST_OP(binary_post_op_position) | DNNL_ARG_SRC_1 |
int8
data types.The following attributes are supported:
Type | Operation | Description | Restrictions |
---|---|---|---|
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. |
Post-op | Sum | Adds the operation result to the destination tensor instead of overwriting it. | |
Post-op | Eltwise | Applies an Eltwise operation to the result. | |
Post-op | Binary | Applies a Binary operation to the result | General binary post-op restrictions |
The source and destination tensors may have f32
, bf16
, or int8
data types. See Data Types page for more details.
The binary primitive works with arbitrary data tensors. There is no special meaning associated with any of tensors dimensions.
Engine | Name | Comments |
---|---|---|
CPU/GPU | binary_example_cpp |