| 91 | } |
| 92 | |
| 93 | bool Run(Node* node) |
| 94 | { |
| 95 | Tensor* input_tensor = node->GetInputTensor(0); |
| 96 | Tensor* output_tensor = node->GetOutputTensor(0); |
| 97 | const TShape& shape = input_tensor->GetShape(); |
| 98 | int elem_num = shape.GetSize(); |
| 99 | float* input = ( float* )get_tensor_mem(input_tensor); |
| 100 | float* output = ( float* )get_tensor_mem(output_tensor); |
| 101 | /// void* data = get_tensor_mem(input_tensor); |
| 102 | /// int ret = kernel_run(data, elem_num, &op_param); |
| 103 | #define SIGMOID_MAX(a, b) ((a) > (b) ? (a) : (b)) |
| 104 | #define SIGMOID_MIN(a, b) ((a) < (b) ? (a) : (b)) |
| 105 | /* |
| 106 | for(int i = 0; i < elem_num; i++) |
| 107 | { |
| 108 | input[i] = SIGMOID_MIN(input[i], 30.0f); |
| 109 | input[i] = SIGMOID_MAX(input[i], -30.0f); |
| 110 | std::cout<< input[i] << " "; |
| 111 | float tmp_exp = exp8mul(-input[i]); |
| 112 | output[i] = 1 / (1 + tmp_exp); |
| 113 | std::cout<< tmp_exp << " " <<output[i] << "\n"; |
| 114 | } |
| 115 | */ |
| 116 | |
| 117 | float32x4_t min = vdupq_n_f32(-30.0f); |
| 118 | float32x4_t max = vdupq_n_f32(30.0f); |
| 119 | float32x4_t tmp_vec = vdupq_n_f32(1); |
| 120 | for(int i = 0; i < (elem_num & -4); i += 4) |
| 121 | { |
| 122 | float32x4_t _input = vld1q_f32(input + i); |
| 123 | _input = vmaxq_f32(_input, min); |
| 124 | _input = vminq_f32(_input, max); |
| 125 | float32x4_t tmp_exp = vaddq_f32(tmp_vec, vexpq10_f32(vmulq_n_f32(_input, -1.0f))); |
| 126 | /// float32x4_t tmp_exp = vaddq_f32(tmp_vec, vexpq_f32(vmulq_n_f32(_input, -1.0f))); |
| 127 | float32x4_t out = vrecpeq_f32(tmp_exp); |
| 128 | out = vmulq_f32(vrecpsq_f32(tmp_exp, out), out); |
| 129 | out = vmulq_f32(vrecpsq_f32(tmp_exp, out), out); |
| 130 | vst1q_f32(output, out); |
| 131 | output += 4; |
| 132 | } |
| 133 | for(int i = elem_num & ~3; i < elem_num; i++) |
| 134 | { |
| 135 | input[i] = SIGMOID_MIN(input[i], 30.0f); |
| 136 | input[i] = SIGMOID_MAX(input[i], -30.0f); |
| 137 | float tmp_exp = exp10_f32(-input[i]); |
| 138 | *output++ = 1 / (1 + tmp_exp); |
| 139 | } |
| 140 | |
| 141 | return true; |
| 142 | } |
| 143 | }; |
| 144 | |
| 145 | NodeOps* SelectFunc(const CPUInfo* info, Node* node) |
nothing calls this directly
no test coverage detected