News for hackers. Stuff that matters.
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by dragontamer on Tuesday April 17, 2018 @01:52PM (#16860650)
The code I'd like to highlight in this example is as follows:

    U64 bishopAttacks(U64 occ, enumSquare sq) {
       occ &= mBishopTbl[sq].mask;
       occ *= mBishopTbl[sq].magic;
       occ >>= 64-9;
       return mBishopAttacks[sq][occ];
    }
Two bit-operations and one Multiply are all that is needed to "perfect hash" a bishop's position + all of the possible combinations of pieces which might block it. From there, the "occ" variable serves as a lookup-table's index, providing a pre-calculated bitmask of all of the locations a bishop can attack.

It seems like the "occ" bitboard represents the occupancy of the board. (A bitmask of 1 for every piece that could block the bishop's movement). While "enumSquare" seems to be the square the bishop is actually on.

In effect, this is a time-space tradeoff, with every single bishop (or rook) attack being precomputed in a lookup table. Then, during runtime, two-bit operations + one multiply are all that is needed to use the table.

---------------

Some notes to help decipher what is going on:

* Because a chessboard is 64 squares, a 64-bit long integer is all that's needed to represent true/false values across a board. These "true-false" collections across a chessboard are called "bitboards", and can represent anything from board state (Ex: a bitboard that represents all black pawns), to "potential moves a bishop can make" that the AI should iterate against.

* The general problem to solve here is called the Sliding Piece Attack: https://chessprogramming.wikispaces.com/Sliding+Piece+Attack... . Bishops and Rooks are complicated, because they may be blocked by enemy and/or friendly pieces. Other pieces (Knights, Pawns, or Kings) have much simpler movement patterns.

That's what makes this so magnificent: the calculation in runtime is calculated in something like ~15 clock cycles on a modern machine. (2 cycles for the two bitwise operations, 5 cycles for the multiply, and 5 cycles for an L2 lookup)

Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by ZirconiumX on Wednesday April 18, 2018 @02:53AM (#16865235)
Something interesting to note is the variety of ideas based on this. What you see there is "plain" magic bitboards, where the right-shift is constant and used to index a two-dimensional array.

That's rather wasteful, because the centre squares need only around 2^5 occupancies, which is why "fancy" magic bitboards exist. In these, the right-shift is variable, and the occupancy calculation is added to a table of offsets to get the output, shrinking the tables from about 2MB to 800KiB for even the "easy" right-shift amounts.

So the question is whether we can find smaller magic numbers[1]. Niklas Fiekas has found a trick[2] that helps reduce the brute-force search space for magics, but it's still not trivial to solve.

[1]: http://chessprogramming.wikispaces.com/Best%20Magics%20so%20... [2]: http://www.talkchess.com/forum/viewtopic.php?t=65187

I could also make a write-up of Hyperbola Quintessence, which I think is a fantastic bit of bit-twiddling, if someone is interested.

Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by xoroshiro on Tuesday April 17, 2018 @07:25PM (#16863219)
> something like ~15 clock cycles

Even less with PEXT! https://chessprogramming.wikispaces.com/BMI2#PEXTBitboards

Poking around and reading through the wiki blew my mind. I hope they are archived somewhere.

Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by perl4ever on Tuesday April 17, 2018 @03:36PM (#16861575)
Imagine an alternate history in which chessboards were always 9x9, but computers were 64 bit as here...
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by tytytytytytytyt on Tuesday April 17, 2018 @07:57PM (#16863424)
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by ateesdalejr on Tuesday April 17, 2018 @04:58PM (#16862261)
Ouch. I can already imagine all the painful ways in which that would be worked around.
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by gowld on Tuesday April 17, 2018 @07:40PM (#16863314)
Computers used to be 32bit, 16bit, 8bit...
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by eutectic on Wednesday April 18, 2018 @03:47PM (#16870484)
But 64-bit is enough to represent essentially any value you might care to manipulate numerically, with rare exceptions such as cryptography. Given the constraints and trade-offs of real world computing, I suspect 128-bit will never become the norm.
Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by dragontamer on Thursday April 19, 2018 @03:23PM (#16879198)
You might want to look into AVX-512.

Yeah, 512-bits / SIMD computations. If chessboards were bigger, then we'd probably just use the SIMD registers. 128-bit SSE is quite common, and 256-bit AVX has been around for ~5 years now.

Re:Magic Bitboards: Finding all valid bishop moves in a 64-b... by perl4ever on Tuesday April 17, 2018 @08:23PM (#16863583)
Computers used to have 6 bit bytes and 36 bit words...I don't have my mom's IBM 704 manual anymore though.