Skip to content

Commit 87caa3a

Browse files
committed
fix wraparound issue in Jaro simd
1 parent 39d36d5 commit 87caa3a

8 files changed

Lines changed: 577 additions & 201 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Changelog
22

3+
## [2.2.1] - 2023-10-31
4+
### Fixed
5+
- fix wraparound issue in simd implementation of Jaro and Jaro Winkler
6+
37
## [2.2.0] - 2023-10-30
48
#### Performance
59
- improve performance of simd implementation for LCS and Indel by up to 50%

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
3232
message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
3333
endif()
3434

35-
project(rapidfuzz LANGUAGES CXX VERSION 2.2.0)
35+
project(rapidfuzz LANGUAGES CXX VERSION 2.2.1)
3636

3737
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
3838
include(GNUInstallDirs)

bench/bench-jarowinkler.cpp

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,20 @@ static void BM_JaroLongNonSimilarSequence(benchmark::State& state)
6565
}
6666

6767
#ifdef RAPIDFUZZ_SIMD
68-
template <size_t MaxLen>
68+
template <size_t MaxLen1, size_t MaxLen2>
6969
static void BM_Jaro_SIMD(benchmark::State& state)
7070
{
7171
std::vector<std::string> seq1;
7272
std::vector<std::string> seq2;
7373
std::vector<double> results(64);
7474
for (int i = 0; i < 64; i++)
75-
seq1.push_back(generate(MaxLen));
75+
seq1.push_back(generate(MaxLen1));
7676
for (int i = 0; i < 10000; i++)
77-
seq2.push_back(generate(MaxLen));
77+
seq2.push_back(generate(MaxLen2));
7878

7979
size_t num = 0;
8080
for (auto _ : state) {
81-
rapidfuzz::experimental::MultiJaro<MaxLen> scorer(seq1.size());
81+
rapidfuzz::experimental::MultiJaro<MaxLen1> scorer(seq1.size());
8282
for (const auto& str1 : seq1)
8383
scorer.insert(str1);
8484

@@ -94,15 +94,15 @@ static void BM_Jaro_SIMD(benchmark::State& state)
9494
}
9595
#endif
9696

97-
template <size_t MaxLen>
97+
template <size_t MaxLen1, size_t MaxLen2>
9898
static void BM_Jaro(benchmark::State& state)
9999
{
100100
std::vector<std::string> seq1;
101101
std::vector<std::string> seq2;
102102
for (int i = 0; i < 256; i++)
103-
seq1.push_back(generate(MaxLen));
103+
seq1.push_back(generate(MaxLen1));
104104
for (int i = 0; i < 10000; i++)
105-
seq2.push_back(generate(MaxLen));
105+
seq2.push_back(generate(MaxLen2));
106106

107107
size_t num = 0;
108108
for (auto _ : state) {
@@ -118,15 +118,15 @@ static void BM_Jaro(benchmark::State& state)
118118
benchmark::Counter::kIsRate | benchmark::Counter::kInvert);
119119
}
120120

121-
template <size_t MaxLen>
121+
template <size_t MaxLen1, size_t MaxLen2>
122122
static void BM_Jaro_Cached(benchmark::State& state)
123123
{
124124
std::vector<std::string> seq1;
125125
std::vector<std::string> seq2;
126126
for (int i = 0; i < 256; i++)
127-
seq1.push_back(generate(MaxLen));
127+
seq1.push_back(generate(MaxLen1));
128128
for (int i = 0; i < 10000; i++)
129-
seq2.push_back(generate(MaxLen));
129+
seq2.push_back(generate(MaxLen2));
130130

131131
size_t num = 0;
132132
for (auto _ : state) {
@@ -143,21 +143,38 @@ static void BM_Jaro_Cached(benchmark::State& state)
143143
benchmark::Counter::kIsRate | benchmark::Counter::kInvert);
144144
}
145145

146-
BENCHMARK_TEMPLATE(BM_Jaro, 8);
147-
BENCHMARK_TEMPLATE(BM_Jaro, 16);
148-
BENCHMARK_TEMPLATE(BM_Jaro, 32);
149-
BENCHMARK_TEMPLATE(BM_Jaro, 64);
146+
BENCHMARK_TEMPLATE(BM_Jaro, 8, 8);
147+
BENCHMARK_TEMPLATE(BM_Jaro, 16, 16);
148+
BENCHMARK_TEMPLATE(BM_Jaro, 32, 32);
149+
BENCHMARK_TEMPLATE(BM_Jaro, 64, 64);
150150

151-
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 8);
152-
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 16);
153-
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 32);
154-
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 64);
151+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 8, 8);
152+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 16, 16);
153+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 32, 32);
154+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 64, 64);
155155

156156
#ifdef RAPIDFUZZ_SIMD
157-
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 8);
158-
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 16);
159-
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 32);
160-
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 64);
157+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 8, 8);
158+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 16, 16);
159+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 32, 32);
160+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 64, 64);
161+
#endif
162+
163+
BENCHMARK_TEMPLATE(BM_Jaro, 8, 1000);
164+
BENCHMARK_TEMPLATE(BM_Jaro, 16, 1000);
165+
BENCHMARK_TEMPLATE(BM_Jaro, 32, 1000);
166+
BENCHMARK_TEMPLATE(BM_Jaro, 64, 1000);
167+
168+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 8, 1000);
169+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 16, 1000);
170+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 32, 1000);
171+
BENCHMARK_TEMPLATE(BM_Jaro_Cached, 64, 1000);
172+
173+
#ifdef RAPIDFUZZ_SIMD
174+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 8, 1000);
175+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 16, 1000);
176+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 32, 1000);
177+
BENCHMARK_TEMPLATE(BM_Jaro_SIMD, 64, 1000);
161178
#endif
162179

163180
BENCHMARK(BM_JaroLongSimilarSequence)

0 commit comments

Comments
 (0)