commit 9f1f57a19c3c281a931dfc71b318494487193d56 Author: sophgo-forum-service <forum_service@sophgo.com> Date: Mon May 13 13:58:23 2024 +0800 [feat] cvikernel opensource for cv18xx soc. - 79b6a7, set lookup_interp_table layer_id.
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
#include "kernel_1880v2.h"
|
|
|
|
bmk1880v2_op_t * bmk1880v2_tiu_element_wise_mul(
|
|
ctx_t *ctx,
|
|
const bmk1880v2_tiu_element_wise_mul_param_t *p)
|
|
{
|
|
int bf16_enable = (p->a->fmt == FMT_BF16) ? 1 : 0;
|
|
|
|
check_tiu_tensor_2(p->res_low, p->a);
|
|
assert_same_shape(p->res_low, p->a);
|
|
if (!p->b_is_const) {
|
|
check_tiu_tensor(p->b);
|
|
assert_same_shape(p->res_low, p->b);
|
|
}
|
|
if (p->res_high)
|
|
check_16bit_tiu_tensor(p->res_low, p->res_high);
|
|
|
|
tiu_reg_t reg;
|
|
reset_tiu_reg(®);
|
|
|
|
reg.cmd_en = 1;
|
|
reg.tsk_typ = DCR_TYPE_TENSOR_ARITH_FIX8B;
|
|
reg.tsk_eu_typ = TENSOR_MUL_FIX8B;
|
|
reg.tsk_opd_num = 2;
|
|
reg.opd_typ = bf16_enable ? 1: 0;
|
|
int arith_shift = tensor_is_signed(p->res_low);
|
|
reg.opt_shift_typ = arith_shift;
|
|
reg.opt_right_shift = p->rshift_bits;
|
|
reg.opt_relu = p->relu_enable;
|
|
fill_same_tensor_shape(®, p->a->shape);
|
|
fill_same_tensor_stride_type(®, 0b11);
|
|
|
|
reg.opd0_addr = p->a->start_address;
|
|
reg.opt_opd0_sign = tensor_is_signed(p->a);
|
|
fill_opd0_stride(®, &p->a->stride);
|
|
|
|
if (p->b_is_const) {
|
|
reg.opt_opd1_const = 1;
|
|
reg.opd1_addr = bf16_enable ? p->b_const.val : (p->b_const.val & 0xFF);
|
|
reg.opt_opd1_sign = !!p->b_const.is_signed;
|
|
} else {
|
|
reg.opt_opd1_const = 0;
|
|
reg.opd1_addr = p->b->start_address;
|
|
reg.opt_opd1_sign = tensor_is_signed(p->b);
|
|
fill_opd1_stride(®, &p->b->stride);
|
|
}
|
|
|
|
reg.res0_addr = p->res_low->start_address;
|
|
reg.opt_res0_sign = tensor_is_signed(p->res_low);
|
|
reg.opt_res0_int8 = (p->res_high == NULL);
|
|
fill_res0_stride(®, &p->res_low->stride);
|
|
if (p->res_high)
|
|
reg.res0_b_str = (p->res_high->start_address - p->res_low->start_address);
|
|
if (p->relu_enable)
|
|
ASSERT(reg.opt_res0_int8);
|
|
|
|
ASSERT((
|
|
p->b_is_const || (!reg.opt_opd1_sign && !reg.opt_opd0_sign && !reg.opt_shift_typ) ||
|
|
((reg.opt_opd1_sign || reg.opt_opd0_sign) && reg.opt_shift_typ)
|
|
));
|
|
|
|
/* [15:0] layer id */
|
|
reg.layer_info = p->layer_id;
|
|
|
|
return emit_tiu_cmdbuf(ctx, ®);
|
|
}
|