Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: making code color independant

Author: Heiner Marxen

Date: 12:48:31 12/08/03

Go up one level in this thread


On December 08, 2003 at 15:22:11, Russell Reagan wrote:

>On December 08, 2003 at 13:47:36, Heiner Marxen wrote:
>
>>Those small arrays indexed by color (I assume color is 0 or 1),
>>can sometimes be replaced by unconditional expressions, which do not even
>>need a memory reference, by filling small bit groups into a single constant,
>>and shifting out the relevant part:
>>    lastRank[2] ={ 7, 0 }
>>translates to
>>    (0x70 >> (onMove*4)) & 0x0f
>>
>>[ Looks ugly, but somehow I like it :-) ]
>>
>>In this special case we an do even better than the general approach:
>>    (8 - onMove) & 07
>
>But how often will the compiler convert the code to this (or did you mean that
>you should do the optimization yourself?)? I had an optimization in mind once
>that I thought the compiler should have no problem with. Something like:
>
>enum Color { white, black };
>
>inline void ChangeColor ( Color & color )
>{
>    static const Color oppositeColor[2] = { black, white };
>    color = oppositeColor[color];
>}
>
>I had hoped to use an enum in C++ to assure that a Color would always be white
>or black, and I had hoped the compiler would convert it to something like:
>
>color ^= 1;
>
>But it didn't. I tried several. Maybe newer ones like MSVC++ .NET 2003 or the
>Intel compiler will make these kinds of optimizations though. I tried VC++ 6
>(relatively old now), and the newest gcc. What the compiler did was only a
>little slower than if I forced the optimization:
>
>void ChangeColor ( Color & color )
>{
>    color = Color( color ^ 1 );
>}
>
>But I'd rather not do that, because it defeats my point of using an enum in the
>first place.

You can switch between 2 values by XORing the XOR of the both values.
What is wrong with

    color ^= (white^black);

Is it just that C++ does not let you XOR enums without a cast?
(I do not do C++ myself, just C, so this may show my ignorance)

What _is_ your point of using an enum?

> And of course, 1% because of something like this isn't going to
>make a difference. I think the other issues like whether or not you can avoid
>conditionals (or make them easily predictable), and avoid memory accesses will
>be the main issues that could make a bigger difference.

Yes, that is the goal.
And there are a lot of places for some of these small functions like
"opposite color of".  It may well make a difference.

Of course, tuning the search or eval is much more important, but IMHO
there is some room for these micro-optimizations.  Of course, there
should always be some kind of abstraction (macro, function) such that
you write that ugly construct just once.

Cheers,
Heiner



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.