Skip to content

Commit f816a00

Browse files
committed
speed up fast_bitset by use simd operators
Signed-off-by: LHT129 <[email protected]>
1 parent 29c0959 commit f816a00

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

src/impl/bitset/fast_bitset.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "fast_bitset.h"
1717

18+
#include "simd/bit_simd.h"
1819
#include "vsag_exception.h"
1920

2021
namespace vsag {
@@ -67,10 +68,10 @@ FastBitset::Or(const Bitset& another) {
6768
std::lock_guard<std::shared_mutex> lock2(fast_another->mutex_, std::adopt_lock);
6869
auto max_size = std::max(data_.size(), fast_another->data_.size());
6970
data_.resize(max_size, 0);
70-
// TODO(LHT): use SIMD
71-
for (uint64_t i = 0; i < max_size; ++i) {
72-
data_[i] |= fast_another->data_[i];
73-
}
71+
BitOr(reinterpret_cast<const uint8_t*>(data_.data()),
72+
reinterpret_cast<const uint8_t*>(fast_another->data_.data()),
73+
max_size * sizeof(uint64_t),
74+
reinterpret_cast<uint8_t*>(data_.data()));
7475
}
7576

7677
void
@@ -84,10 +85,10 @@ FastBitset::And(const Bitset& another) {
8485
std::lock_guard<std::shared_mutex> lock2(fast_another->mutex_, std::adopt_lock);
8586
auto max_size = std::max(data_.size(), fast_another->data_.size());
8687
data_.resize(max_size, 0);
87-
// TODO(LHT): use SIMD
88-
for (uint64_t i = 0; i < max_size; ++i) {
89-
data_[i] &= fast_another->data_[i];
90-
}
88+
BitAnd(reinterpret_cast<const uint8_t*>(data_.data()),
89+
reinterpret_cast<const uint8_t*>(fast_another->data_.data()),
90+
max_size * sizeof(uint64_t),
91+
reinterpret_cast<uint8_t*>(data_.data()));
9192
}
9293

9394
void
@@ -101,10 +102,10 @@ FastBitset::Xor(const Bitset& another) {
101102
std::lock_guard<std::shared_mutex> lock2(fast_another->mutex_, std::adopt_lock);
102103
auto max_size = std::max(data_.size(), fast_another->data_.size());
103104
data_.resize(max_size, 0);
104-
// TODO(LHT): use SIMD
105-
for (uint64_t i = 0; i < max_size; ++i) {
106-
data_[i] ^= fast_another->data_[i];
107-
}
105+
BitXor(reinterpret_cast<const uint8_t*>(data_.data()),
106+
reinterpret_cast<const uint8_t*>(fast_another->data_.data()),
107+
max_size * sizeof(uint64_t),
108+
reinterpret_cast<uint8_t*>(data_.data()));
108109
}
109110

110111
std::string
@@ -133,6 +134,9 @@ FastBitset::Not() {
133134
for (auto& word : data_) {
134135
word = ~word;
135136
}
137+
BitNot(reinterpret_cast<const uint8_t*>(data_.data()),
138+
data_.size() * sizeof(uint64_t),
139+
reinterpret_cast<uint8_t*>(data_.data()));
136140
}
137141

138142
void

0 commit comments

Comments
 (0)