hgm wrote:bob wrote:I've not seen anything faster...
That doesn't mean it does not exist, or would be impossible to create. This thread discusses the merits of incrementally updated attack maps, which, when done properly, would lead to an entirely different design from a standard bitboard engine. So I am not talking about how bitboard engines might best do thing, as these would mostly suck for an attack-map design, and would thus never allow you to judge the performance of such a design when you keep doing them.
I am just bringing this up because on several occasions you now wrote "you lost me, because that is not what I am doing in my bitboard engine". Well, of course it is not. I am not describing a bitboard engine, but an attackers-set engine.
But even an "attackers-set engine" uses either of the two main board representations: mailbox or bitboards. So in fact there would be four designs:
A. classical mailbox w/o attackers-sets,
B. mailbox with attackers-sets (presumably incrementally updated),
C. classical bitboards w/o explicitly maintaining attackers-sets, and
D. bitboards with additionally maintaining attackers-sets (incrementally updated as well).
As of today, a common assumption is that C is superior to A speed-wise. Your claim, which I believe instantly, is that a proper implementation of B is superior to A speed-wise as well. Now which are exactly your other claims? As I understand you claim that B would also be superior to C. I would reply "it depends" since I have not seen a thorough comparison, but my gut feeling tells me that C is still leading today.
Now it seems that we disagree about D.
First thing is, your last remark sounds as if you would not see a difference between B and D, I hope I misunderstood that since board representations are still a big difference which I believe to be crucial for certain parts of the engine.
Now my claim, and I think also Bob's, is that it is hard even for an optimized implementation of D to be superior to C, mostly due to the inherent redundancy of maintaining all existing attackers-sets where you can always retrieve the few relevant ones very cheaply with common bitboard technology.
But maybe the C vs. D competition only becomes important if you actually come up with an instance of B that beats C
We should not forget that we would need clearly defined measurement rules. We could measure:
a) perft speed (same hardware, single-threaded, with bulk counting, no hash table);
b) NPS of a material+PST only tree search (same hardware, single-threaded, no hash table, no pruning etc.);
both for a variety of positions with given depths.
More realistic would be
c) time-to-depth for a standard tree search on N cores with all engine features enabled,
but that would require that one single engine implements all the different designs given above via #ifdef which is a huge project.
What do you think?