Author: Ed Schröder
Date: 10:55:19 12/05/01
Go up one level in this thread
On December 05, 2001 at 13:35:02, Uri Blass wrote: >On December 05, 2001 at 12:42:07, Ed Schröder wrote: > >>On December 05, 2001 at 06:46:07, Severi Salminen wrote: >> >>>>>#define color(target) (((info[target])>>3)&3) >>>>> >>>>> >>>>>my data.c file includes >>>>> >>>>>int info[64]; >>>>>int side; >>>>>int direction[64][64]; >>>>>int kingsquare[2]; >>>>>int pin[64]; >>>>> >>>> >>>>Perhaps the data types could be a reason for some microscopic effects. If the >>>>variable "side" is for instance of type "short", the compiler has to zero-extend >>>>the variable to word-size before indexing (because of the array access). >>> >>>But as you can see the variables are all ints. So no type conversions needed. I >>>believe there is just some stupid alignment thing happening or something and >>>that's why the program slows down a bit. I'd use side instead of color(sq) and >>>hopefully the speedup will show up later. >>> >>>Severi >> >> >>You could try to decrease the >> >>int direction[64][64]; >> >>by one, thus: >> >>int direction[63][64]; >> >>The result might be the compiler doesn't have to do an expensive multiply >>(*65) but is able to do a simple shift-left bits instruction (SHL 6) which >>shift left the bytes 6 times, thus a multiply by 64. >> >>Ed > >Thanks for your advices > >direction[i][j] gives information about the direction between every 2 squares(it >can get values 0-3 for rook directions 4-7 for bishops direction,-2 for knight >directions and -1 for no direction). > >Doing what you suggest mean ignoring the corner. > >It is possible that I should change my data structure and simply stop using this >big array > >Example: Instead of using > >if (direction[square][target]<3) in order to see if square and target are in >rook direction(I know that they are in queen direction because they are result >of pseudolegal king move in reply to check) > >I can use > >if ((file0(square)==file0(target))||(rank0(square)==rank0(target))) > >when I have: >#define fil0(i) ((i)&7) >#define rank0(i) ((i)>>3) > >Uri Well, I never leave it up to the compiler to decide things for me but that's easy becausese my background is assembler and my way of programming in C++ still is as close to assembler as possible. In your case I would program it as follows: static char direction [65*65]; // create an area big enough, using char To access the table: int x,y, char result; result = direction [x<<6][y]; That is all. Any good compiler will produce fast code, something like: mov EAX,x mov EBX,y shl EAX,6 add EAX,EBX mov CL,direction[EAX] mov result,CL Note that in your case "char" is enough, it saves an extra SHL 2 (shift-left). Ed
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.