hexagon: add unary tanh op (#22999)

This commit is contained in:
Max Krasnyansky
2026-05-13 06:59:28 -07:00
committed by GitHub
parent e75cd5efb5
commit ad96bb8c0c
4 changed files with 25 additions and 1 deletions
+2
View File
@@ -2865,6 +2865,7 @@ static htp_op_code op_remap_to_htp(const ggml_tensor * t) {
case GGML_UNARY_OP_NEG: return HTP_OP_UNARY_NEG; case GGML_UNARY_OP_NEG: return HTP_OP_UNARY_NEG;
case GGML_UNARY_OP_EXP: return HTP_OP_UNARY_EXP; case GGML_UNARY_OP_EXP: return HTP_OP_UNARY_EXP;
case GGML_UNARY_OP_SOFTPLUS: return HTP_OP_UNARY_SOFTPLUS; case GGML_UNARY_OP_SOFTPLUS: return HTP_OP_UNARY_SOFTPLUS;
case GGML_UNARY_OP_TANH: return HTP_OP_UNARY_TANH;
default: default:
break; break;
} }
@@ -3335,6 +3336,7 @@ static bool ggml_backend_hexagon_device_supports_op(ggml_backend_dev_t dev, cons
case GGML_UNARY_OP_EXP: case GGML_UNARY_OP_EXP:
case GGML_UNARY_OP_SIGMOID: case GGML_UNARY_OP_SIGMOID:
case GGML_UNARY_OP_SOFTPLUS: case GGML_UNARY_OP_SOFTPLUS:
case GGML_UNARY_OP_TANH:
supp = ggml_hexagon_supported_unary(sess, op); supp = ggml_hexagon_supported_unary(sess, op);
break; break;
case GGML_UNARY_OP_SILU: case GGML_UNARY_OP_SILU:
+1
View File
@@ -62,6 +62,7 @@ enum htp_op_code {
HTP_OP_UNARY_EXP, HTP_OP_UNARY_EXP,
HTP_OP_UNARY_NEG, HTP_OP_UNARY_NEG,
HTP_OP_UNARY_SOFTPLUS, HTP_OP_UNARY_SOFTPLUS,
HTP_OP_UNARY_TANH,
HTP_OP_GLU_SWIGLU, HTP_OP_GLU_SWIGLU,
HTP_OP_GLU_SWIGLU_OAI, HTP_OP_GLU_SWIGLU_OAI,
HTP_OP_GLU_GEGLU, HTP_OP_GLU_GEGLU,
+1
View File
@@ -542,6 +542,7 @@ static int execute_op(struct htp_ops_context * octx) {
case HTP_OP_UNARY_SIGMOID: case HTP_OP_UNARY_SIGMOID:
case HTP_OP_UNARY_NEG: case HTP_OP_UNARY_NEG:
case HTP_OP_UNARY_EXP: case HTP_OP_UNARY_EXP:
case HTP_OP_UNARY_TANH:
case HTP_OP_L2_NORM: case HTP_OP_L2_NORM:
return op_unary(octx); return op_unary(octx);
+21 -1
View File
@@ -373,6 +373,21 @@ static void l2_norm_f32(const float * restrict src,
} }
} }
static void tanh_f32(const float * restrict src,
float * restrict dst,
uint8_t * restrict spad,
const uint32_t num_rows,
const uint32_t row_elems,
const size_t row_size,
int32_t * op_params) {
for (uint32_t ir = 0; ir < num_rows; ir++) {
const uint8_t * restrict src_local = (const uint8_t *)src + (ir * row_size);
uint8_t * restrict dst_local = (uint8_t *)dst + (ir * row_size);
hvx_tanh_f32_aa(dst_local, src_local, row_elems);
}
}
static void unary_job_f32_per_thread(unsigned int nth, unsigned int ith, void * data) { static void unary_job_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
const struct htp_unary_context * uctx = (const struct htp_unary_context *) data; const struct htp_unary_context * uctx = (const struct htp_unary_context *) data;
struct htp_ops_context * octx = uctx->octx; struct htp_ops_context * octx = uctx->octx;
@@ -477,6 +492,9 @@ static void unary_job_f32_per_thread(unsigned int nth, unsigned int ith, void *
case HTP_OP_UNARY_SOFTPLUS: case HTP_OP_UNARY_SOFTPLUS:
softplus_f32(src0_spad, dst_spad, NULL, block_size, ne0, src0_row_size_aligned, op_params); softplus_f32(src0_spad, dst_spad, NULL, block_size, ne0, src0_row_size_aligned, op_params);
break; break;
case HTP_OP_UNARY_TANH:
tanh_f32(src0_spad, dst_spad, NULL, block_size, ne0, src0_row_size_aligned, op_params);
break;
case HTP_OP_L2_NORM: case HTP_OP_L2_NORM:
l2_norm_f32(src0_spad, dst_spad, NULL, block_size, ne0, src0_row_size_aligned, op_params); l2_norm_f32(src0_spad, dst_spad, NULL, block_size, ne0, src0_row_size_aligned, op_params);
break; break;
@@ -547,10 +565,12 @@ static int execute_op_unary_f32(struct htp_ops_context * octx) {
case HTP_OP_UNARY_SOFTPLUS: case HTP_OP_UNARY_SOFTPLUS:
op_type = "softplus-f32"; op_type = "softplus-f32";
break; break;
case HTP_OP_UNARY_TANH:
op_type = "tanh-f32";
break;
case HTP_OP_L2_NORM: case HTP_OP_L2_NORM:
op_type = "l2norm-f32"; op_type = "l2norm-f32";
break; break;
default: default:
FARF(ERROR, "Unsupported unary Op %u\n", octx->op); FARF(ERROR, "Unsupported unary Op %u\n", octx->op);
return HTP_STATUS_NO_SUPPORT; return HTP_STATUS_NO_SUPPORT;