#include <iostream>
#include <algorithm>
#include <array>
-#include <bitset>
#include <type_traits>
#include "../nnue_common.h"
#include "affine_transform.h"
}
return v;
}();
- alignas(CacheLineSize) static inline const std::array<unsigned, 256> lookup_count = [](){
- std::array<unsigned, 256> v;
- for (int i = 0; i < 256; ++i)
- v[i] = unsigned(std::bitset<8>(i).count());
- return v;
- }();
// Find indices of nonzero numbers in an int32_t array
template<const IndexType InputDimensions>
const auto lookup = (nnz >> (j * 8)) & 0xFF;
const auto offsets = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&lookup_indices[lookup]));
_mm_storeu_si128(reinterpret_cast<__m128i*>(out + count), _mm_add_epi16(base, offsets));
- count += lookup_count[lookup];
+ count += popcount(lookup);
base = _mm_add_epi16(base, increment);
}
}