summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-12-19 20:16:55 +0100
committerGitHub <noreply@github.com>2017-12-19 20:16:55 +0100
commita5760e9537aee7fd123e1455424b1083d6881ee8 (patch)
tree9ffe0983308081de8cc38fa5a53d444c85ca053b
parentd34215a65829e508b2acb4e9037c98872b98268b (diff)
parentb0c4683b5643d39f76dde45187307e7f8fceaa5b (diff)
Merge pull request #4495 from vespa-engine/balder/use-2inN-hash-instead-of-prime-number-to-avoid-modulo
Balder/use 2in n hash instead of prime number to avoid modulo
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp5
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor.h3
-rw-r--r--vespalib/src/vespa/vespalib/stllike/hash_map.hpp16
3 files changed, 17 insertions, 7 deletions
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp
index 1aa05bf4f61..e4cd9037588 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.cpp
@@ -190,4 +190,7 @@ SparseTensor::reduce(join_fun_t op,
}
-VESPALIB_HASH_MAP_INSTANTIATE(vespalib::tensor::SparseTensorAddressRef, double);
+// VESPALIB_HASH_MAP_INSTANTIATE(vespalib::tensor::SparseTensorAddressRef, double);
+
+VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(vespalib::tensor::SparseTensorAddressRef, double, vespalib::hash<vespalib::tensor::SparseTensorAddressRef>,
+ std::equal_to<vespalib::tensor::SparseTensorAddressRef>, vespalib::hashtable_base::and_modulator);
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.h b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.h
index 78c69bd5e43..3eeb122f48c 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor.h
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor.h
@@ -21,7 +21,8 @@ namespace vespalib::tensor {
class SparseTensor : public Tensor
{
public:
- using Cells = vespalib::hash_map<SparseTensorAddressRef, double>;
+ using Cells = hash_map<SparseTensorAddressRef, double, hash<SparseTensorAddressRef>,
+ std::equal_to<SparseTensorAddressRef>, hashtable_base::and_modulator>;
static constexpr size_t STASH_CHUNK_SIZE = 16384u;
diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp
index 359ba235a36..40ef90826b6 100644
--- a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp
+++ b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp
@@ -64,12 +64,18 @@ hash_map<K, V, H, EQ, M>::getMemoryUsed() const
}
-#define VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, H) \
- template class vespalib::hash_map<K, V, H>; \
- template class vespalib::hashtable<K, std::pair<K,V>, H, std::equal_to<K>, std::_Select1st<std::pair<K,V>>>; \
- template vespalib::hashtable<K, std::pair<K,V>, H, std::equal_to<K>, std::_Select1st<std::pair<K,V>>>::insert_result \
- vespalib::hashtable<K, std::pair<K,V>, H, std::equal_to<K>, std::_Select1st<std::pair<K,V>>>::insert(std::pair<K,V> &&); \
+
+#define VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, M) \
+ template class vespalib::hash_map<K, V, H, E, M>; \
+ template class vespalib::hashtable<K, std::pair<K,V>, H, E, std::_Select1st<std::pair<K,V>>, M>; \
+ template vespalib::hashtable<K, std::pair<K,V>, H, E, std::_Select1st<std::pair<K,V>>, M>::insert_result \
+ vespalib::hashtable<K, std::pair<K,V>, H, E, std::_Select1st<std::pair<K,V>>, M>::insert(std::pair<K,V> &&); \
template class vespalib::Array<vespalib::hash_node<std::pair<K,V>>>;
+#define VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, E) \
+ VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, vespalib::hashtable_base::prime_modulator)
+
+#define VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, H) VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, std::equal_to<K>)
+
#define VESPALIB_HASH_MAP_INSTANTIATE(K, V) VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, vespalib::hash<K>)