diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-06-19 12:13:29 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2020-06-19 12:13:29 +0000 |
commit | c56ffa5e2735b6e3873aa18edc5e54a9128f3108 (patch) | |
tree | b64c3bbc9cee9bd5b0900bfe51cac5a4686c08f6 | |
parent | cdc65c6b2b0734fb97b7f466ba0139ce6406559c (diff) |
Wire flag to enable multi-threaded indexing for a hnsw index.
5 files changed, 17 insertions, 14 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/hnsw_index_params.h b/searchcommon/src/vespa/searchcommon/attribute/hnsw_index_params.h index c8b196023d6..5f974f509c6 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/hnsw_index_params.h +++ b/searchcommon/src/vespa/searchcommon/attribute/hnsw_index_params.h @@ -16,29 +16,29 @@ private: uint32_t _neighbors_to_explore_at_insert; // This is always the same as in the attribute config, and is duplicated here to simplify usage. DistanceMetric _distance_metric; - bool _allow_multi_threaded_indexing; + bool _multi_threaded_indexing; public: HnswIndexParams(uint32_t max_links_per_node_in, uint32_t neighbors_to_explore_at_insert_in, DistanceMetric distance_metric_in, - bool allow_multi_threaded_indexing_in = false) + bool multi_threaded_indexing_in = false) : _max_links_per_node(max_links_per_node_in), _neighbors_to_explore_at_insert(neighbors_to_explore_at_insert_in), _distance_metric(distance_metric_in), - _allow_multi_threaded_indexing(allow_multi_threaded_indexing_in) + _multi_threaded_indexing(multi_threaded_indexing_in) {} uint32_t max_links_per_node() const { return _max_links_per_node; } uint32_t neighbors_to_explore_at_insert() const { return _neighbors_to_explore_at_insert; } DistanceMetric distance_metric() const { return _distance_metric; } - bool allow_multi_threaded_indexing() const { return _allow_multi_threaded_indexing; } + bool multi_threaded_indexing() const { return _multi_threaded_indexing; } bool operator==(const HnswIndexParams& rhs) const { return (_max_links_per_node == rhs._max_links_per_node && _neighbors_to_explore_at_insert == rhs._neighbors_to_explore_at_insert && _distance_metric == rhs._distance_metric && - _allow_multi_threaded_indexing == rhs._allow_multi_threaded_indexing); + _multi_threaded_indexing == rhs._multi_threaded_indexing); } }; diff --git a/searchcore/src/tests/proton/attribute/attribute_test.cpp b/searchcore/src/tests/proton/attribute/attribute_test.cpp index 91f580cd221..dabab649497 100644 --- a/searchcore/src/tests/proton/attribute/attribute_test.cpp +++ b/searchcore/src/tests/proton/attribute/attribute_test.cpp @@ -811,18 +811,18 @@ public: const vespalib::string dense_tensor = "tensor(x[2])"; AVConfig -get_tensor_config(bool allow_multi_threaded_indexing) +get_tensor_config(bool multi_threaded_indexing) { AVConfig cfg(AVBasicType::TENSOR); cfg.setTensorType(ValueType::from_spec(dense_tensor)); - cfg.set_hnsw_index_params(HnswIndexParams(4, 4, DistanceMetric::Euclidean, allow_multi_threaded_indexing)); + cfg.set_hnsw_index_params(HnswIndexParams(4, 4, DistanceMetric::Euclidean, multi_threaded_indexing)); return cfg; } std::shared_ptr<MockDenseTensorAttribute> -make_mock_tensor_attribute(const vespalib::string& name, bool allow_multi_threaded_indexing) +make_mock_tensor_attribute(const vespalib::string& name, bool multi_threaded_indexing) { - auto cfg = get_tensor_config(allow_multi_threaded_indexing); + auto cfg = get_tensor_config(multi_threaded_indexing); return std::make_shared<MockDenseTensorAttribute>(name, cfg); } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp index 8f19d5c203b..9b54ae816e0 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_writer.cpp @@ -40,7 +40,7 @@ use_two_phase_put_for_attribute(const AttributeVector& attr) const auto& cfg = attr.getConfig(); if (cfg.basicType() == search::attribute::BasicType::Type::TENSOR && cfg.hnsw_index_params().has_value() && - cfg.hnsw_index_params().value().allow_multi_threaded_indexing()) + cfg.hnsw_index_params().value().multi_threaded_indexing()) { return true; } diff --git a/searchlib/src/tests/attribute/attributemanager/attributemanager_test.cpp b/searchlib/src/tests/attribute/attributemanager/attributemanager_test.cpp index 3728b87c6df..b94186626c2 100644 --- a/searchlib/src/tests/attribute/attributemanager/attributemanager_test.cpp +++ b/searchlib/src/tests/attribute/attributemanager/attributemanager_test.cpp @@ -297,11 +297,14 @@ AttributeManagerTest::testConfigConvert() a.index.hnsw.enabled = true; a.index.hnsw.maxlinkspernode = 32; a.index.hnsw.neighborstoexploreatinsert = 300; + a.index.hnsw.multithreadedindexing = true; auto out = ConfigConverter::convert(a); EXPECT_TRUE(out.hnsw_index_params().has_value()); - EXPECT_EQUAL(32u, out.hnsw_index_params().value().max_links_per_node()); - EXPECT_EQUAL(300u, out.hnsw_index_params().value().neighbors_to_explore_at_insert()); - EXPECT_TRUE(out.hnsw_index_params().value().distance_metric() == dm_out); + const auto& params = out.hnsw_index_params().value(); + EXPECT_EQUAL(32u, params.max_links_per_node()); + EXPECT_EQUAL(300u, params.neighbors_to_explore_at_insert()); + EXPECT_TRUE(params.distance_metric() == dm_out); + EXPECT_TRUE(params.multi_threaded_indexing()); } { // hnsw index params (disabled) CACA a; diff --git a/searchlib/src/vespa/searchlib/attribute/configconverter.cpp b/searchlib/src/vespa/searchlib/attribute/configconverter.cpp index f6c39b9570d..f435f79bf65 100644 --- a/searchlib/src/vespa/searchlib/attribute/configconverter.cpp +++ b/searchlib/src/vespa/searchlib/attribute/configconverter.cpp @@ -90,7 +90,7 @@ ConfigConverter::convert(const AttributesConfig::Attribute & cfg) if (cfg.index.hnsw.enabled) { retval.set_hnsw_index_params(HnswIndexParams(cfg.index.hnsw.maxlinkspernode, cfg.index.hnsw.neighborstoexploreatinsert, - dm)); + dm, cfg.index.hnsw.multithreadedindexing)); } if (retval.basicType().type() == BasicType::Type::TENSOR) { if (!cfg.tensortype.empty()) { |