@@ -61,17 +61,22 @@ constexpr std::array<int, 64> inputBuckets = []{
6161}();
6262
6363// organizing this somewhat similarly to code I've seen, mostly from clarity_sp_nnue, made by Ciekce.
64-
65- struct Network {
66- alignas (64 ) std::array<std::int16_t , inputSize * inputBucketCount * layer1Size> featureWeights;
67- alignas (64 ) std::array<std::int16_t , layer1Size> featureBiases;
68- alignas (64 ) std::array<std::int16_t , layer1Size * 2 * outputBucketCount> outputWeights;
69- alignas (64 ) std::array<std::int16_t , outputBucketCount> outputBiases;
64+ #if defined(__AVX512F__) && defined(__AVX512BW__)
65+ constexpr int alignmentAmount = 64 ;
66+ #else
67+ constexpr int alignmentAmount = 32 ;
68+ #endif
69+
70+ struct alignas (alignmentAmount) Network {
71+ std::array<std::int16_t , inputSize * inputBucketCount * layer1Size> featureWeights;
72+ std::array<std::int16_t , layer1Size> featureBiases;
73+ std::array<std::int16_t , layer1Size * 2 * outputBucketCount> outputWeights;
74+ std::array<std::int16_t , outputBucketCount> outputBiases;
7075};
7176
7277struct Accumulator {
73- alignas (64 ) std::array<std::int16_t , layer1Size> black;
74- alignas (64 ) std::array<std::int16_t , layer1Size> white;
78+ alignas (alignmentAmount ) std::array<std::int16_t , layer1Size> black;
79+ alignas (alignmentAmount ) std::array<std::int16_t , layer1Size> white;
7580 void initialize (std::span<const std::int16_t , layer1Size> bias);
7681 void initHalf (std::span<const std::int16_t , layer1Size> bias, int color);
7782};
@@ -132,4 +137,4 @@ constexpr bool refreshRequired(int color, int oldKingSquare, int newKingSquare)
132137 }
133138
134139 return inputBuckets[oldKingSquare] != inputBuckets[newKingSquare];
135- }
140+ }
0 commit comments