MCPcopy Create free account
hub / github.com/OAID/Tengine / Run

Method Run

executor/operator/arm32/hardswish_float.cpp:52–101  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

50 name_ = "arm_hardswish_fp32";
51 }
52 bool Run(Node* node)
53 {
54 Tensor* input_tensor = node->GetInputTensor(0);
55 Tensor* output_tensor = node->GetOutputTensor(0);
56 Hardswish* Hardswish_op = dynamic_cast<Hardswish*>(node->GetOp());
57 HardswishParam* param_ = Hardswish_op->GetParam();
58 float alpha = param_->alpha;
59 float beta = param_->beta;
60 float lower = -beta / alpha;
61 float upper = (1.f / alpha) + lower;
62
63 int elem_num = input_tensor->GetShape().GetSize();
64
65 float* data = ( float* )get_tensor_mem(input_tensor);
66 float* out_data = ( float* )get_tensor_mem(output_tensor);
67
68 float32x4_t _zero = vdupq_n_f32(0.f);
69 float32x4_t _one = vdupq_n_f32(1.f);
70 for(int i = 0; i < (elem_num & -4); i += 4)
71 {
72 float32x4_t _p = vld1q_f32(data+i);
73 float32x4_t _ans = vdupq_n_f32(beta);
74 _ans = vmlaq_n_f32(_ans, _p, alpha);
75 _ans = vmaxq_f32(_ans, _zero);
76 _ans = vminq_f32(_ans, _one);
77 _ans = vmulq_f32(_ans, _p);
78 vst1q_f32(out_data+i, _ans);
79 }
80 for(int i = elem_num & ~3; i < elem_num; i++)
81 {
82 if (data[i] < lower)
83 out_data[i] = 0.f;
84 else if (data[i] > upper) out_data[i] = data[i];
85 else
86 out_data[i] = data[i] * (data[i] * alpha + beta);
87 }
88/*
89 for(int i = 0; i < elem_num; i++)
90 {
91 if (data[i] < lower)
92 out_data[i] = 0.f;
93 else if (data[i] > upper) out_data[i] = data[i];
94 else
95 out_data[i] = data[i] * (data[i] * alpha + beta);
96 }
97*/
98
99 return true;
100
101 }
102};
103
104NodeOps* SelectFunc(const CPUInfo* cpu_info, Node* node)

Callers

nothing calls this directly

Calls 6

get_tensor_memFunction · 0.85
GetOpMethod · 0.80
GetParamMethod · 0.80
GetInputTensorMethod · 0.45
GetOutputTensorMethod · 0.45
GetSizeMethod · 0.45

Tested by

no test coverage detected