#ifndef CPU_AARCH64_JIT_PRIMITIVE_CONF_HPP
#define CPU_AARCH64_JIT_PRIMITIVE_CONF_HPP
#include <stdint.h>
#include "common/primitive_attr.hpp"
#include "cpu/aarch64/brgemm/brgemm_types.hpp"
#include "cpu/aarch64/cpu_isa_traits.hpp"
namespace dnnl {
namespace impl {
namespace cpu {
namespace aarch64 {
enum class jit_memory_tag_kind_t { ncsp, nspc, blocked, undef };
enum conv_version_t {
ver_unused,
ver_fma,
ver_sve_512,
ver_sve_256,
ver_sve_128,
};
enum conv_loop_order_t {
loop_cgn,
loop_gnc,
loop_ngc,
loop_gncw,
loop_cwgn,
loop_ngcw,
loop_nhwcg,
loop_nwcg
};
enum conv_kernel_kind_t { embd_bcast, expl_bcast };
enum conv_1x1_loop_order_t {
loop_rbl,
loop_rlb,
loop_lbr,
loop_lrb,
loop_blr,
loop_brl
};
enum conv_harness_t {
harness_2d_reduction,
harness_3d_reduction,
harness_mb_reduction,
harness_compute_full_spatial,
harness_nxc
};
enum {
FLAG_MB_FIRST = 1 << 0,
FLAG_MB_LAST = 1 << 1,
FLAG_OC_FIRST = 1 << 2,
FLAG_OC_LAST = 1 << 3,
FLAG_IC_FIRST = 1 << 4,
FLAG_IC_LAST = 1 << 5,
FLAG_SP_FIRST = 1 << 6,
FLAG_SP_LAST = 1 << 7,
FLAG_REDUCE_FIRST = 1 << 8,
FLAG_REDUCE_LAST = 1 << 9,
FLAG_ZERO_FILTER = 1 << 0,
FLAG_ZERO_BIAS = 1 << 1,
FLAG_COMPUTE_BIAS = 1 << 2,
};
struct jit_conv_conf_t {
prop_kind_t prop_kind;
conv_version_t ver;
conv_loop_order_t loop_order;
conv_harness_t harness;
int simd_w;
int ndims;
int mb;
int ngroups, ic, oc, oc_without_padding, ic_without_padding;
int id, ih, iw, od, oh, ow;
int f_pad, l_pad, t_pad;
int back_pad, r_pad, b_pad;
int kd, kh, kw;
int stride_d, stride_h, stride_w;
int dilate_d, dilate_h, dilate_w;
format_tag_t src_tag, wei_tag, dst_tag; bool with_bias;
bool with_sum;
bool with_eltwise;
bool with_binary;
bool is_fused_conv;
int dw_conv_buffer_oc;
post_ops_t::entry_t::eltwise_t eltwise;
post_ops_t post_ops;
int nthr, nthr_mb, nthr_g, nthr_oc_b, nthr_ic_b;
int idp, ihp, iwp, ohp, owp;
int nb_ic, ic_block;
int nb_oc, oc_block;
int nb_iw, iw_block;
int nb_ow, ow_block;
int nb_oc_blocking;
int nb_oc_blocking_thr_chunk;
int nb_ic_blocking, nb_ic_blocking_max; int nb_ic_L2;
int h_blocking;
int nb_oc_L2;
int ic_tail, oc_tail;
int ur_h, ur_w;
int ur_w_tail;
int ur_ic, ur_kw;
bool is_1stconv;
int nonblk_group_off;
conv_kernel_kind_t kernel_kind;
int tr_iw, tr_ih;
int tr_kw, tr_kh;
int tr_src_num_guard_elems;
size_t tr_src_buf_size, tr_src_buf_count;
size_t tr_diff_dst_buf_size, tr_diff_dst_buf_count;
int nthr_mb_work;
int tr_ld;
int kh_step;
int typesize_in;
int typesize_out;
int typesize_bia;
int typesize_acc;
int ic_nb1, ic_nb2;
int oc_nb1;
int ur_ow_max, ur_ow, ur_ow_tail;
int ur_ow_nsteps;
data_type_t bia_dt;
data_type_t dst_dt;
data_type_t src_dt;
data_type_t wei_dt;
data_type_t dsrc_dt;
data_type_t dwei_dt;
bool expl_bcast;
bool large_spatial, large_w_filter;
int is_oc_scale;
int max_regs_ur; int nb_ch, ch_block, nb_ch_blocking;
bool is_depthwise, is_fast_depthwise, is_resrc_depthwise;
int aligned_threads;
int h_blk_size, oh_blk_size;
bool signed_input;
bool need_saturation;
float wei_adj_scale;
bool src_zero_point;
bool dst_zero_point;
bool zp_src_is_common;
bool uses_permw_transposition;
bool transpose_src;
bool transpose_dst;
int ic_block_step;
cpu_isa_t isa;
bool is_hw_transp; };
inline int calculate_extended_filter_size(int filter_size, int dilation) {
return (filter_size - 1) * (dilation + 1) + 1;
}
inline int calculate_end_padding(int start_padding, int dst_size, int src_size,
int spatial_stride, int dilated_filter_size) {
return (dst_size - 1) * spatial_stride + dilated_filter_size
- (src_size + start_padding);
}
inline status_t init_tag(format_tag_t &tag, const memory_desc_wrapper &mdw,
const format_tag_t &tag_value) {
if (mdw.format_kind() == format_kind::any) return status::unimplemented;
tag = mdw.matches_one_of_tag(tag_value);
return tag == tag_value ? status::success : status::unimplemented;
}
struct jit_conv_args_t {
const void *src;
const void *dst;
const void *filt;
const void *bias;
const void *src_prf;
const void *dst_prf;
const void *filt_prf;
const void *bias_prf;
const void *scales;
const void *acc_s32;
const void *compensation;
const int32_t *zp_compensation;
const int32_t *src_zero_point;
const int32_t *dst_zero_point;
const void *tile_cfg;
const void *tile_cfg_tail;
const void *post_ops_binary_rhs_arg_vec;
size_t oc_l_off;
const void *dst_orig;
size_t oc_l_off_prf;
const void *dst_orig_prf;
size_t kd_offset;
size_t kd_offset_prf;
size_t kh_offset;
size_t kh_offset_prf;
size_t os_index_begin;
size_t os_index_begin_prf;
size_t os_index_end;
size_t os_index_end_prf;
size_t kd_padding;
size_t kd_padding_prf;
size_t kh_padding;
size_t kh_padding_prf;
size_t iwb;
size_t iwb_prf;
size_t owb;
size_t owb_prf;
size_t kw_padding;
size_t channel;
size_t channel_prf;
size_t oc_blocks;
size_t ur_w;
size_t ur_str_w;
size_t ch_blocks;
size_t ch_blocks_prf;
size_t reduce_work;
size_t reduce_work_prf;
size_t load_work;
size_t load_work_prf;
size_t t_overflow;
size_t b_overflow;
size_t f_overflow;
size_t back_overflow;
size_t last_h;
size_t tail;
size_t current_iw;
size_t is_osb;
int flags;
int flags_prf;
int oc_flag;
};
struct jit_deconv_args_t {
const void *src;
const void *dst;
const void *filt;
const void *bias;
const void *scales;
const void *compensation;
const int32_t *zp_src_pad_str_compensation;
const int32_t *zp_compensation;
const int32_t *src_zero_point;
const int32_t *dst_zero_point;
const void *post_ops_binary_rhs_arg_vec;
const void *dst_orig;
size_t oc_l_off;
size_t t_overflow;
size_t b_overflow;
size_t f_overflow;
size_t back_overflow;
size_t kh_padding;
size_t kd_padding;
size_t oc_blocks;
};
struct jit_dw_conv_args_t {
const void *input;
const void *output;
const void *filter;
const void *bias;
size_t kh_count;
size_t oh_count;
size_t oh_index;
size_t filter_pad_off;
unsigned char
exec_flags;
};
struct jit_1x1_conv_conf_t {
prop_kind_t prop_kind;
conv_version_t ver;
int ndims;
int mb;
int ngroups, ic, oc, oc_without_padding, ic_without_padding;
int id, ih, iw, od, oh, ow;
int f_pad, t_pad, l_pad;
int kd, kh, kw;
int stride_d, stride_h, stride_w;
format_tag_t src_tag, wei_tag, dst_tag; bool with_bias;
bool with_sum;
bool with_eltwise;
bool with_binary;
bool with_dw_conv;
post_ops_t post_ops;
post_ops_t::entry_t::eltwise_t eltwise;
int is, os;
int ic_block, oc_block;
int ur, ur_tail;
int reduce_dim, reduce_block, nb_reduce, nb_reduce_blocking,
nb_reduce_blocking_max;
int load_dim, load_block, nb_load, nb_load_blocking, nb_load_blocking_max,
nb_load_chunk;
int bcast_dim, bcast_block, nb_bcast, nb_bcast_blocking,
nb_bcast_blocking_max;
int reduce_loop_unroll, reduce_loop_bcast_step, reduce_loop_load_step;
int load_loop_load_step, load_loop_iter_step;
int bcast_loop_output_step, bcast_loop_output_substep;
int bcast_loop_bcast_step, bcast_loop_bcast_substep;
int fma_step;
int load_grp_count;
conv_1x1_loop_order_t loop_order;
bool use_vmovntps;
bool expl_bcast;
int typesize_in;
int typesize_out;
int typesize_bia;
int typesize_acc;
bool transpose_src;
int tr_is;
int nthr, nthr_mb, nthr_g, nthr_oc_b, nthr_ic_b;
int is_oc_scale;
data_type_t bia_dt;
data_type_t dst_dt;
bool signed_input;
float wei_adj_scale;
bool src_zero_point;
bool dst_zero_point;
bool zp_src_is_common;
cpu_isa_t isa;
bool uses_permw_transposition;
};
struct jit_1x1_conv_args_t {
const void *bcast_data;
const void *load_data;
const void *output_data;
const void *bias_data; const void *acc_s32;
const void *scales;
const void *compensation;
const void *store_buffer;
const int32_t *zp_compensation;
const int32_t *src_zero_point;
const int32_t *dst_zero_point;
const void *post_ops_binary_rhs_arg_vec;
size_t oc_l_off;
const void *dst_orig;
size_t load_dim;
size_t bcast_dim;
size_t reduce_dim;
size_t output_stride;
size_t first_last_flag;
};
struct jit_pool_conf_t {
int ndims;
int mb, c, c_without_padding;
int id, ih, iw, od, oh, ow;
int stride_d, stride_h, stride_w;
int kd, kh, kw;
int f_pad, t_pad, l_pad;
alg_kind_t alg;
bool is_training;
bool pad_w_is_null;
bool is_backward;
bool simple_alg;
bool is_c_padded;
data_type_t ind_dt;
int c_block, c_tail, nb_c;
int ur_bc, ur_bc_tail;
int ur_c, ur_c_tail;
int ur;
size_t tail[4];
bool safe_c_tail;
data_type_t src_dt;
data_type_t dst_dt;
int dt_size;
bool is_bf16;
bool is_f16;
jit_memory_tag_kind_t tag_kind;
bool is_plain() const {
return (tag_kind == jit_memory_tag_kind_t::ncsp
|| tag_kind == jit_memory_tag_kind_t::nspc);
}
cpu_isa_t isa;
post_ops_t post_ops;
bool with_postops;
bool with_eltwise;
bool with_binary;
int nthr;
memory_desc_t tmp_md;
};
struct jit_uni_pooling_args_t {
const void *src;
const void *dst;
const void *indices;
const void *src_prf;
const void *dst_prf;
const void *indices_prf;
const void *post_ops_binary_rhs_arg_vec;
const void *dst_orig;
const void *dst_po_helper;
size_t zero_ih;
size_t zero_id;
const void *zero_ptr;
size_t kd_padding;
size_t kh_padding;
size_t kh_padding_shift;
size_t kd_padding_shift;
size_t kw_padding;
const void *init_value;
float ker_area_h;
size_t ur_bc; size_t b_c; };
struct jit_shuffle_conf_t {
unsigned ndims = 0;
dim_t mb = 0, c = 0, d = 0, h = 0, w = 0, sp = 0;
unsigned stride_mb = 0;
unsigned blk_size = 0;
unsigned group_size = 0;
unsigned axis = 0;
unsigned axis_size = 0;
unsigned simd_tail = 0;
unsigned simd_w = 0;
jit_memory_tag_kind_t tag_kind = jit_memory_tag_kind_t::undef;
data_type_t data_type = data_type::undef;
size_t dt_size = 0;
unsigned el_size_of_indices = 0;
dim_t c_split_size = 0;
dim_t sp_split_size = 0;
cpu_isa_t isa = isa_undef;
};
struct jit_uni_shuffle_args_t {
const void *src = nullptr;
void *dst = nullptr;
const void *input_off_ptr = nullptr;
dim_t cb_loop_size
= 0; bool is_padded_block = false;
};
struct jit_brdgmm_conv_conf_t {
int nthr;
int mb, ngroups, ic, oc;
int id, ih, iw, od, oh, ow;
int f_pad, back_pad, l_pad, r_pad, t_pad, b_pad;
int kd, kh, kw;
int stride_d, stride_h, stride_w;
int nb_ch, ch_block, chb_tail;
int nb_ch_blocking;
int ow_block, ow_tail, nb_ow;
int chb_tail_idx, ow_tail_idx, nb_ch_blocking_idx;
int adjusted_batch_size;
bool with_bias;
bool with_post_ops;
bool with_scale;
bool is_oc_scale;
data_type_t src_dt;
data_type_t wei_dt;
data_type_t bia_dt;
data_type_t dst_dt;
brgemm_batch_kind_t batch_kind;
size_t src_dsz;
size_t wei_dsz;
size_t bia_dsz;
size_t dst_dsz;
cpu_isa_t isa;
};
enum conv_brgemm_loop_order_t {
loop_ndhwgc,
loop_ngcdhw,
};
enum conv_brgemm_exec_type_t {
exec_undefined = 0,
exec_base,
exec_trans,
exec_vpad,
};
struct jit_brgemm_conv_conf_t {
cpu_isa_t isa;
prop_kind_t prop_kind;
conv_version_t ver;
conv_brgemm_loop_order_t loop_order;
conv_harness_t harness;
int simd_w, acc_simd_w;
int ndims;
int mb;
int ngroups, ic, oc, oc_without_padding, ic_without_padding;
int od_block, oh_block, nb_od,
nb_oh; int id_block, ih_block, nb_id, nb_ih;
dim_t inp_buffer_size, inp_buffer_mask_size;
conv_brgemm_exec_type_t exec_type;
int id, ih, iw, od, oh, ow, os, is, idp, ihp, iwp, icp, odp, ohp, owp, ocp;
int f_pad, l_pad, t_pad;
int back_pad, r_pad, b_pad;
int l_ovf, r_ovf, t_ovf, b_ovf, f_ovf, back_ovf;
int kd, kh, kw;
int ext_kd, ext_kh, ext_kw;
int kd_block, kh_block, kw_block, kd_block_pad, kh_block_pad, kw_block_pad;
int stride_d, stride_h, stride_w;
int dilate_d, dilate_h, dilate_w;
format_tag_t src_tag, wei_tag, dst_tag; bool with_bias;
bool with_sum;
bool with_eltwise;
bool with_binary;
bool is_fused_conv;
bool is_is_blocking;
bool is_os_blocking;
bool is_rtus;
bool ununroll_bd_loop {false};
int nb_ic, ic_block;
int nb_oc, oc_block;
int nb_iw, iw_block, iw_tail;
int nb_ow, ow_block, ow_tail;
int nb_is, is_block;
int nb_os, os_block;
int nb_oc_blocking;
int nb_ic_blocking;
int nb_is_blocking;
int nb_os_blocking;
data_type_t src_dt;
data_type_t dst_dt;
data_type_t wei_dt;
data_type_t acc_dt;
data_type_t bia_dt;
size_t src_dsz;
size_t wei_dsz;
size_t dst_dsz;
size_t acc_dsz;
size_t bia_dsz;
bool use_buffer;
dim_t buffer_size;
dim_t ker_ranges_size;
dim_t comp_a_buffer_size;
dim_t s8s8_comp_buffer_size;
bool with_scales;
int is_ic_scale, is_oc_scale;
int LDA, LDB, LDC, LDD;
int M, N, K, M_tail, N_tail, K_tail;
int brgM, brgM_tail;
int gemm_batch_size, adjusted_batch_size;
brgemm_batch_kind_t brg_type;
dim_t brg_stride_a, brg_stride_b;
int nthr;
int max_batch;
int max_vpad;
bool wei_plain;
bool is_ic_padded, is_oc_padded;
int kw_sets, kh_sets;
bool copy_block_only;
int use_M_mask;
int oskip, iskip;
bool brgemm_bd_loop_innermost;
bool use_uker;
bool var_bs {false};
bool use_interleave_stores;
brgemm_kernel_prefetching_t hint_prefetching;
bool is_1x1;
bool s8s8_compensation_required;
bool src_zero_point;
bool dst_zero_point;
bool req_brg_comp_pad;
bool req_cal_comp_pad;
bool is_bf32;
bool comp_with_vpads;
int nthr_mb, nthr_g, nthr_oc_b, nthr_ic_b, nthr_oh;
bool transform_to_vnni;
bool has_int8_vnni;
float scale_adjust_factor;
int ic_tail, oc_tail;
size_t tr_src_buf_size, tr_src_buf_count;
size_t tr_diff_dst_buf_size, tr_diff_dst_buf_count;
int tr_src_num_guard_elems;
bool global_transpose; int nthr_mb_work;
int tr_iw, tr_ow;
int spatial_blk_size; int typesize_in;
int typesize_out;
bool tr_ocb_chunk = false;
bool tr_icb_chunk = false;
};
enum class binary_op_t : unsigned { none, c_blocked, n_spatial_c, n_c_spatial };
enum class binary_bcast_t : unsigned {
none, scalar,
per_batch,
per_c,
per_w
};
struct jit_binary_conf_t {
binary_op_t op_type = binary_op_t::none;
binary_bcast_t bcast_type = binary_bcast_t::none;
bool do_scale_src0 = false;
bool do_scale_src1 = false;
bool do_sum = false;
bool with_eltwise = false;
bool with_binary = false;
bool with_postops = false;
float sum_scale = 0.f;
bool use_stride_src1 = false;
bool broadcast_src1_value = false;
bool use_stride_rhs_postops = false;
bool postops_per_oc_broadcast_exists = false;
bool is_i8 = false;
bool is_bf16 = false;
bool is_src_different_layouts = false;
dim_t outer_dims = 1;
int src1_stride = 1;
int not_bcasted_sp_dims = 0;
cpu_isa_t isa = isa_undef;
data_type_t src0_type = data_type::undef;
data_type_t src1_type = data_type::undef;
data_type_t dst_type = data_type::undef;
};
struct jit_uni_binary_args_t {
const void *src0, *src1, *dst, *indices;
const float *scales_src0, *scales_src1;
size_t spat_offt_count;
const void *post_ops_binary_rhs_arg_vec;
size_t src1_stride_range;
const void *dst_orig;
};
} } } }
#endif