133{
134 ARM_COMPUTE_UNUSED(
info);
135 ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this);
136 ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(INEKernel::window(), window);
137
138 const size_t lookup_dim = _output->info()->num_dimensions() - 1;
139 const int const_0 = _output->info()->data_type() == DataType::QASYMM8
140 ? _output->info()->quantization_info().uniform().offset
141 : 0;
142
143 std::unordered_map<int32_t, size_t> key_index_map;
144 for (size_t n = 0; n < _keys->info()->dimension(0); ++n)
145 {
146 const int32_t key = *reinterpret_cast<int32_t *>(_keys->ptr_to_element({n}));
147 key_index_map[key] = n;
148 }
149 std::vector<size_t> lookup_indices;
150 for (size_t k = 0; k < _lookups->info()->dimension(0); ++k)
151 {
152 const int32_t key = *reinterpret_cast<int32_t *>(_lookups->ptr_to_element({k}));
153 const auto it = key_index_map.find(key);
154 if (it == key_index_map.end())
155 {
156 lookup_indices.emplace_back(NOT_HIT);
157 *_hits->ptr_to_element({k}) = 0;
158 }
159 else
160 {
161#if defined(ARM_COMPUTE_DEBUG_ENABLED)
162 if (it->second >= _keys->info()->dimension(0))
163 ARM_COMPUTE_ERROR("HashTable Lookup: Index out of bounds.");
164#endif
165 lookup_indices.emplace_back(it->second);
166 *_hits->ptr_to_element({k}) = 1;
167 }
168 }
169
170 Window output_window{window};
171 output_window.set(Window::DimX,
172 Window::Dimension(output_window.x().start(), output_window.x().end(),
173 _input->info()->dimension(0)));
174
175 Window out_slice = output_window.first_slice_window_4D();
176 do
177 {
178 Iterator output_it(_output, out_slice);
179
180 execute_window_loop(
181 out_slice,
182 [&](const Coordinates &id) {
183 const auto lookup = lookup_indices.at(id[lookup_dim]);
184 if (lookup == NOT_HIT)
185 {
186 memset(output_it.ptr(), const_0,
187 _output->info()->dimension(0) * _output->info()->element_size());
188 }
189 else
190 {
191 Coordinates input_id{id};
192 input_id.set(lookup_dim, lookup);
193 memcpy(output_it.ptr(), _input->ptr_to_element(input_id),
194 _output->info()->dimension(0) * _output->info()->element_size());
195 }
196 },
197 output_it);
198
199 } while (window.slide_window_slice_4D(out_slice));
200}
volatile const char info[]