Author: Uri Blass
Date: 06:59:13 02/20/03
Go up one level in this thread
On February 20, 2003 at 07:57:47, Uri Blass wrote: >On February 20, 2003 at 07:43:29, Filip Tvrzsky wrote: > >>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 > >Thanks > >I used that trick in other defines but did not think to do it here. >I hope that it is going to help me. > >Uri I see that it does not help me. I had to replace in hundreds of places in my code and after all the job I have 2 problems from the opening position: 1)The code is slightly slower in the first ply(1% slower) 2)The bigger problem:after more than 40 seconds I start to get different number of nodes(maybe I did a mistake in one of my replaces). Uri
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.