1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

Double magics generation speed

Profiling shows that resetting attacks table after
a failed candidate magic attempt is the biggest
time consumer, so rewrite the logic avoiding the
memset()

Magics init for rook+bishop goes from 200msecs to
under 100msec.

No functional change.
This commit is contained in:
Marco Costalba 2015-03-22 11:27:32 +01:00
parent be77406a55
commit 35a082064f

View file

@ -249,7 +249,9 @@ namespace {
{ 728, 10316, 55013, 32803, 12281, 15100, 16645, 255 } };
Bitboard occupancy[4096], reference[4096], edges, b;
int i, size;
int age[4096], current = 0, i, size;
std::memset(age, 0, sizeof(age));
// attacks[s] is a pointer to the beginning of the attacks table for square 's'
attacks[SQ_A1] = table;
@ -298,22 +300,21 @@ namespace {
magics[s] = rng.sparse_rand<Bitboard>();
while (popcount<Max15>((magics[s] * masks[s]) >> 56) < 6);
std::memset(attacks[s], 0, size * sizeof(Bitboard));
// A good magic must map every possible occupancy to an index that
// looks up the correct sliding attack in the attacks[s] database.
// Note that we build up the database for square 's' as a side
// effect of verifying the magic.
for (i = 0; i < size; ++i)
for (++current, i = 0; i < size; ++i)
{
Bitboard& attack = attacks[s][index(s, occupancy[i])];
unsigned idx = index(s, occupancy[i]);
if (attack && attack != reference[i])
if (age[idx] < current)
{
age[idx] = current;
attacks[s][idx] = reference[i];
}
else if (attacks[s][idx] != reference[i])
break;
assert(reference[i]);
attack = reference[i];
}
} while (i < size);
}