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

Method Run

executor/operator/arm64/hardswish_float.cpp:53–102  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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