Author: Matt Taylor
Date: 20:03:51 01/25/03
Go up one level in this thread
On January 25, 2003 at 17:54:58, David Rasmussen wrote: >On January 25, 2003 at 17:28:23, Russell Reagan wrote: > >> >>As far as implementing a FirstOne() and PopCount(), I don't think it matters >>about the order of the bits or what they mean. Certainly the PopCount() doesn't >>matter, since it is just the count of the set bits, and the order doesn't matter >>at all. FirstOne() will *usually* not matter, but it might sometimes. For >>instance, when generating moves (like Crafty does), it calls the FirstOne() >>function just to say, "tell me where another piece is". Crafty doesn't really >>care where that piece is, so FirstOne() *could* return any of the indexes that a >>piece is on (instead of the least significant bit or most significant bit) and >>it would still work fine. Sometimes you might actually need to know the least >>significant bit or most significant bit, so it might matter there. In general it >>isn't going to matter though, and in general, it isn't going to affect the >>strength of your engine unless these functions are just horribly inefficient. >>Otherwise, maybe 1-2 elo. > >Of course it doesn't matter for PopCount(), that was my mistake. But it's >certainly important very often to know where a piece is, so it is certainly a >good idea for FirstOne() to return something that matches your indexing. And >orientation is definitely important here. > >On the other hand, it would be interesting to know if one could make an even >faster function (called SomeBit()) than a normal FirstBit() in IA-32 assembly, >if the order of the returned bits did not matter. For movegen a function returns >the index of such a bit and also clears it, would be useful, if it meant that it >could be done even faster. > >/David It is a good question, but I can think of no good answer. Isolating the bit makes it easier to index, and isolating the LSB is easiest on x86 because of bb & -bb. Of course, the P6 family is the x86 exception here with the ability to find MSB or LSB equally fast without needing bb & -bb. (Yay for priority encoders!) For "portable" performance, the SomeBit() idea is superb. You could implement SomeBit() in terms of whatever is most efficient for a particular architecture -- i.e. Dr. Hyatt has pointed out many times that Cray is most efficient with the MSB. The x86 would use LSB (no penalty on P6, better performance on all others). -Matt
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.