| 178 | } |
| 179 | |
| 180 | void CLQLSTMLayerNormalizationKernel::run(const Window &window, cl::CommandQueue &queue) |
| 181 | { |
| 182 | ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); |
| 183 | ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(ICLKernel::window(), window); |
| 184 | |
| 185 | Window slice = window.first_slice_window_2D(); |
| 186 | // Set slice step equal to width to force gws[0] to 1, as each thread normalizes across all rows |
| 187 | slice.set_dimension_step(Window::DimX, _input->info()->dimension(0)); |
| 188 | |
| 189 | Window weight_window; |
| 190 | Window weight_slice; |
| 191 | |
| 192 | weight_window.use_tensor_dimensions(_weight->info()->tensor_shape()); |
| 193 | weight_slice = weight_window.first_slice_window_1D(); |
| 194 | |
| 195 | do |
| 196 | { |
| 197 | unsigned int idx = 0; |
| 198 | add_2D_tensor_argument(idx, _input, slice); |
| 199 | add_1D_tensor_argument(idx, _weight, weight_slice); |
| 200 | add_1D_tensor_argument(idx, _bias, weight_slice); |
| 201 | add_2D_tensor_argument(idx, _output, slice); |
| 202 | |
| 203 | enqueue(queue, *this, slice, lws_hint()); |
| 204 | } while (window.slide_window_slice_2D(slice)); |
| 205 | } |
| 206 | } // namespace arm_compute |
nothing calls this directly
no test coverage detected