index_rhash Module



Contents


Derived Types

type, public ::  index_rhash_t

Components

Type Visibility Attributes Name Initial
type(shared_rhash_t), private :: shared_ht

Type-Bound Procedures

procedure , public , :: hash_function Function
procedure , public , :: alloc Subroutine
procedure , public , :: dealloc Subroutine
procedure , public , :: count_index Subroutine
procedure , public , :: add_index Subroutine
procedure , public , :: finalize_setup Subroutine
procedure , public , :: setup_offsets Subroutine
procedure , public , :: lookup Subroutine
procedure , public , :: known_conflicts Function
procedure , public , :: sync Subroutine

Functions

private function hash_function(this, index) result(hval)

Get the hash value for an arbitrary input value @param index input value to get the hash value for

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(in) :: this
integer(kind=int64), intent(in) :: index

Return Value integer(kind=int64)

private function known_conflicts(this) result(t_kc)

During initialisation, we can only start writing values once the offsets are known. This requires knowledge about the number of conflicts per hash value. This function tells us whether the conflicts have already been counted. @return t_kc true if and only if the conflicts have already been counted.

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(in) :: this

Return Value logical


Subroutines

private subroutine alloc(this, n_elem, htsize)

Allocate the internal (shared) memory @param[in] n_elem number of distinct values to store @param[in] htsize range of the hash function

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(inout) :: this
integer(kind=int64), intent(in) :: n_elem
integer(kind=int64), intent(in) :: htsize

private subroutine dealloc(this)

Deallocate all arrays associated with this hash table object

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(inout) :: this

private subroutine count_index(this, index)

Log the occurence of this index in the set of indices to be stored Does not add it, only updates the offsets @param[in] index index value to be logged

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(inout) :: this
integer(kind=int64), intent(in) :: index

private subroutine setup_offsets(this)

For performance reasons, we cannot directly calculate the offsets, but instead first count the number of conflicts per hash value. Then, we sum these up cumulatively Directly counting the offsets is horrifically slow

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(inout) :: this

private subroutine add_index(this, index, pos)

Add an input value to the stored values, assuming we already know the offsets @param[in] index value to be stored @param[out] pos on return, the position where this value was stored

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(inout) :: this
integer(kind=int64), intent(in) :: index
integer(kind=int64), intent(out) :: pos

private subroutine finalize_setup(this)

Dealloates temporary arrays used for initialisation

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t) :: this

private subroutine lookup(this, index, pos, t_found)

Look up a value in this hash table. Returns whether the value is stored and if yes, where @param[in] index value to be looked up @param[out] pos on return, the position of index if found, else 0 @param[out] t_found on return, true if and only if index was found

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(in) :: this
integer(kind=int64), intent(in) :: index
integer(kind=int64), intent(out) :: pos
logical, intent(out) :: t_found

private subroutine sync(this)

For a MPI-3 shared memory array, synchronization is required after/before each read/write epoch

Arguments

Type IntentOptional Attributes Name
class(index_rhash_t), intent(in) :: this