Author: Filip Tvrzsky
Date: 04:43:29 02/20/03
Go up one level in this thread
On February 20, 2003 at 07:13:58, Uri Blass wrote: >On February 20, 2003 at 06:54:01, Filip Tvrzsky wrote: > >>On February 20, 2003 at 06:26:39, Uri Blass wrote: >> >>>On February 19, 2003 at 10:45:27, Dezhi Zhao wrote: >>> >>>>On February 19, 2003 at 09:57:13, Uri Blass wrote: >>>> >>>>>On February 19, 2003 at 09:41:35, Dezhi Zhao wrote: >>>>> >>>>>>On February 19, 2003 at 06:39:49, Uri Blass wrote: >>>>>> >>>>>>>I try to do movei faster and there are things that are supposed to do it >>>>>>>slightly faster but for some reasons do it slower so I deleted them(Maybe it is >>>>>>>better if I ignore it because it is a compiler optimization noise but I do not >>>>>>>like to see the program slower even if it is only 0.1% slower). >>>>>>> >>>>>>>Note that I do not use now compiler optimization except optimize for speed with >>>>>>>visual C++6. >>>>>>> >>>>>>> >>>>>>>Here is an example: >>>>>>>My function of adding pawn moves to the stack of moves get 2 numbers(from,to). >>>>>>> >>>>>>>I found that special functions to generate white moves one square forward,white >>>>>>>moves 2 pawns forward,black pawns one square forward,...helped me to do movei >>>>>>>faster. >>>>>>> >>>>>>>Common sense say that now I do not need 2 numbers in my functions because >>>>>>>I always have to=from-8 in >>>>>>> >>>>>>>Here is my function. >>>>>>>to is always from-8 and the question is if I can take advantage of that fact. >>>>>>> >>>>>>>static void gen_quietblackslowpawns(int from,int to) >>>>>>>{ >>>>>>> gen_t *g; >>>>>>> if (to<=7) >>>>>>> { >>>>>>> gen_promote(from,to); >>>>>>> return; >>>>>>> } >>>>>>> g=&gen_dat[first_move[ply+1]++]; >>>>>>> g->m.b.from=(char)from; >>>>>>> g->m.b.to=(char) to; >>>>>>> g->m.b.promote=0; >>>>>>> g->m.b.bits=16; >>>>>>> #if MODE!=MODE_PERFT >>>>>>> g->score = history[from][to]; >>>>>>> g->index=-10000; >>>>>>> #endif >>>>>>>} >>>>>> >>>>>>I think you can get a little from that fact. It will save a few push and pop >>>>>>operations. >>>>>> >>>>>>By the way, if you really want to optimize this function, you should consider >>>>>>re-designing the b structure so that the move can be saved in a single write >>>>>>operation, instead of 4. >>>>> >>>>>Thanks for the advise but how do I do it >>>>> >>>>>I have the same data structure as tscp here(Note that 90% of my code is >>>>>different than tscp but I copied part of it's data structures). >>>>> >>>>>Here is my b structure >>>>> >>>>>typedef struct >>>>>{ >>>>> char from; >>>>> char to; >>>>> char promote; >>>>> char bits; >>>>>} >>>>>move_bytes; >>>>> >>>>>typedef union >>>>>{ >>>>> move_bytes b; >>>>> int u; >>>>>} >>>>>move; >>>>> >>>>> >>>>>I can think about deleting the b and have something like >>>>>g->m.u=from+(to<<8)+(promote<<16)+bits<<24) but the question in that case is if >>>> >>>>yes. you can go this way. for this function, the last 2 items are simple >>>>constants anyways. >>>> >>>>>it is not going to do accesing the varaibles slower because there are places in >>>>>the code when I use bits and now I will need to use things like u>>24. >>>>> >>>>>I have no idea about the price of these things so I cannot evaluate speed here. >>>>> >>>>>Uri >>>> >>>>Not that complicated if you think it twice. I do know the semantics of bits >>>>thare. However I assume it is a flag. If it is the case, you do not need to do a >>>>shift to make it flat. Consider testing the other way without shift operations: >>>>u & (16 << 24) >>>>So you can avoid shift operations in many cases. So you still gain something >>>>here. >>>> >>>>dzhao >>> >>>I try it at this moment(I do not know if it is going to make the code faster so >>>I saved the previous code). >>> >>>The problem is how to make my code readable at the same time. >>> >>>I deleted the m.u and m.b.from,m.b,to,... >>>and have only m that is an integer. >>> >>>I try to use some defines >>> >>>#define mfrom (m&63) >>>#define mto ((m>>8)&63) >>>#define mpromote ((m>>16)&63) >>>#define mbits ((m>>24)&63) >>> >>>It was not enough so I added the following defines >>> >>>#define gen_dat_i_mfrom (gen_dat[i].m&63) >>>#define gen_dat_i_mto ((gen_dat[i].m>>8)&63) >>>#define gen_dat_i_mpromote ((gen_dat[i].m>>16)&63) >>>#define gen_dat_i_mbits ((gen_dat[i].m>>24)&63) >>> >>>I see that it is not enough and I need the same for other varaibles that are of >>>the same type. >>> >>>I do not like it so I went back to my previous code >>> >>>Thanks in advance for advices. >>> >>>Uri >> >>Why do you not use inline functions? I think this is just the case to employ >>them. >>I have such a code in my engine: >> inline unsigned char From(MOVE x) { return (unsigned char) ((x >> 8) & 0x77); >>} >>and so on. >>Filip > >I do not know how to use inline functions. >Note that I learned only C and not C++ >Is it possible in C? > >I do not find the word inline in the index of the book (The C programming >Language). > >I get errors if I try to add the words inline before a function > >error C2054: expected '(' to follow 'inline' >or if I put inline before the '(' I get > >error C2061: syntax error : identifier 'inline' > >I also do not understand how inline function can help me to get rid of my >structure and to replace the tscp structure by a better structure. > >Uri Sorry, I have noticed your mention about Visual C++ compiler, so assumed using C++ language ... Of course you can't use inline functions in C. But I suppose you to learn little bit about this C++ feature and maybe few others. You don't need learn that OOP stuff, just how to use C++ like improved C. For C language is there another solution - macros with parametres: #define bits(x) ((x>>24)&63) Now you can write simply bits(m) or bits(gen_dat[i].m) or whatever you want. Filip
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.