KOKKOS_INLINE_FUNCTION void operator()( size_type i ) const { const size_type invalid_index = map_type::invalid_index; uint32_t length = 0; size_type min_index = ~0u, max_index = 0; for (size_type curr = m_map.m_hash_lists(i); curr != invalid_index; curr = m_map.m_next_index[curr]) { ++length; min_index = (curr < min_index) ? curr : min_index; max_index = (max_index < curr) ? curr : max_index; } size_type distance = (0u < length) ? max_index - min_index : 0u; size_type blocks = (0u < length) ? max_index/32u - min_index/32u : 0u; // normalize data length = length < 100u ? length : 99u; distance = distance < 100u ? distance : 99u; blocks = blocks < 100u ? blocks : 99u; if (0u < length) { atomic_fetch_add( &m_length(length), 1); atomic_fetch_add( &m_distance(distance), 1); atomic_fetch_add( &m_block_distance(blocks), 1); } }
KOKKOS_INLINE_FUNCTION void operator()( size_type i ) const { const size_type invalid_index = map_type::invalid_index; uint32_t list = m_map.m_hash_lists(i); for (size_type curr = list, ii=0; curr != invalid_index; curr = m_map.m_next_index[curr], ++ii) { printf("%d[%d]: %d->%d\n", list, ii, m_map.key_at(curr), m_map.value_at(curr)); } }
KOKKOS_INLINE_FUNCTION void operator()( size_type i ) const { const size_type invalid_index = map_type::invalid_index; size_type curr = m_map.m_hash_lists(i); size_type next = invalid_index; // remove erased head of the linked-list while (curr != invalid_index && !m_map.valid_at(curr)) { next = m_map.m_next_index[curr]; m_map.m_next_index[curr] = invalid_index; m_map.m_keys[curr] = key_type(); if (m_map.is_set) m_map.m_values[curr] = value_type(); curr = next; m_map.m_hash_lists(i) = next; } // if the list is non-empty and the head is valid if (curr != invalid_index && m_map.valid_at(curr) ) { size_type prev = curr; curr = m_map.m_next_index[prev]; while (curr != invalid_index) { next = m_map.m_next_index[curr]; if (m_map.valid_at(curr)) { prev = curr; } else { // remove curr from list m_map.m_next_index[prev] = next; m_map.m_next_index[curr] = invalid_index; m_map.m_keys[curr] = key_type(); if (map_type::is_set) m_map.m_values[curr] = value_type(); } curr = next; } } }