Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: To bitboard or not to bitboard?

Author: Steven Edwards

Date: 12:32:21 08/30/03

Go up one level in this thread


On August 30, 2003 at 14:37:44, Tord Romstad wrote:

>My program has reached the stage where it is so complicated and ugly that I
>no longer understand clearly how it works (it's rather miraculous that it
>works at all), and there are many parts of the code which I am afraid of
>touching because I am sure I will break something.  Besides, the program
>is horribly slow, searching only about 120 kN/s on a PIV 2.4 GHz.

Comparisons of node frequency are only valid between programs that process
essentially the same information at each node.  So 120 KHz cauld be sluggishly
slow or blindingly fast; it all depends.

In the Old Days, the first Tech program was, by design, the fastest program in
terms of node frequency.  But it was not a top scorer because relatively slower
programs apparently processed more information per node and used it more
effectively.

>1. One of the things I dislike about bitboards (at least the modern
>approach with rotated bitboards) is that even very simple operations
>like generating moves seem to require either using huge lookup tables
>(like in Crafty without -DCOMPACT_ATTACKS) or writing some extremely
>complicated and unreadable code (like Crafty _with_ -DCOMPACT_ATTACKS).
>Is there a way to use rotated bitboards without having big tables,
>and still keeping the code short, clean and readable?

I have some mixed feelings about rotated bitboards, so they are not currently
used in the CT toolkit.  However, the use of rotated bitboards is a low level
design feature and a decision on using them is one you can defer until you can
get the rest of the bitboard operations working.

Indeed, the higher level tasks of a chess program should be blissfully ignorant
of the low level details of data representation.  In C++, the use of either
standard or custom templates for container and iterator classes can completely
isolate the detials of storage and access of moves, boards, etc.

>2. Another problem with bitboards is that there is no obvious way to
>compute "weighted mobility".  While it is trivial to compute the number
>of pseudo-legal moves for a piece with bitboards, this number is usually
>not very interesting (at least not in my program).  In most cases, some
>squares are much more valuable to attack than others.  Given a 64-byte
>array of weights, and a bitboard of squares attacked by a piece, is there
>a fast way to compute the "dot product"?  I have browsed the archive
>and noticed that this question has been discussed numerous times before,
>but I have never seen a good answer (Bob has explained a lot of times
>how to do this on a Cray, which is not very useful to me).

If both the bitboard and the array values change both much and often, there's
not a lot that can be done.  But if, say, the weight array values are fairly
constant, it would be possible to generate look-up tables that are indexed a
byte or word at a time using chunks of the bitboard value.  There are other
approaches as well.

>3. I also dislike the fact that bitboards are much too big to be used
>as indexes to lookup tables, and that extracting information from them
>is often difficult to do without looping through all the 1 bits.  It is
>easy to compute a bitboard of all pieces which attack a given square,
>but in my evaluation I want to extract information about the number and
>types of attackers in a small and compact bitfield (which can be used
>as an index to a lookup table), while throwing away information about
>the locations of all the attackers.  How do I achieve this with bitboards?

Well, how would you do this *without* bitboards?  Write up some code for that,
and then see where parallelization via bitboards can speed up things.



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.