Author: Uri Blass
Date: 02:18:04 01/01/03
Go up one level in this thread
On January 01, 2003 at 04:30:19, Dave Gomboc wrote: >On January 01, 2003 at 02:08:37, Uri Blass wrote: > >>On January 01, 2003 at 01:01:24, Robert Hyatt wrote: >> >>>On December 31, 2002 at 20:32:28, Uri Blass wrote: >>> >>>>On December 31, 2002 at 19:50:43, Robert Hyatt wrote: >>>> >>>>>On December 31, 2002 at 17:49:52, Uri Blass wrote: >>>>> >>>>>>From Ed programmer stuff >>>>>> >>>>>>Killer-One [current ply] 110 >>>>>>Killer-One [current ply-2] 108 >>>>>>Killer-Two [current ply] 106 >>>>>>Killer-Two [current ply-2] 104 >>>>>> >>>>>>I until today used only >>>>>> >>>>>>Killer-One [current ply] >>>>>>Killer-Two [current ply] >>>>>> >>>>>>I am interested to know if using 4 killers is a new idea or maybe this idea is >>>>>>known to be used by other programs. >>>>> >>>>>It was known in 1975. Chess 4.0 used this. You can find it mentioned in >>>>>the chess 4.7 chapter of "Chess Skill in Man and Machine." >>>>> >>>>>We did that in Cray Blitz, but we also did more killers, going back to the >>>>>root in fact... >>>>> >>>>> >>>>> >>>>>> >>>>>>I did try part of the idea that Ed suggested without clear results. >>>>>> >>>>>>I changed the order of moves in movei to >>>>>> >>>>>>Killer-One [current ply] >>>>>>Killer-One [current ply-2] >>>>>>Killer-Two [current ply] >>>>>> >>>>>>instead of >>>>>> >>>>>>Killer-One [current ply] >>>>>>Killer-Two [current ply] >>>>>> >>>>>>I found that it is better only in part of the cases and have not clear results >>>>>>if it is better or worse than previous order but I had a bug in the >>>>>>implementation and I checked killer[ply-2] even in cases when ply-2<0. >>>>>> >>>>>>It is surprising that the program did not crush and even performed better in >>>>>>part of the cases. >>>>>> >>>>>>I still do not use check bound software. >>>>>>I asked in a previous discussion about checking bounds but I solved the >>>>>>problem that caused me to ask about it and I also read a claim that if a >>>>>>varaible is out of bound the program should crush. >>>>>> >>>>>>I also looked for a software that will help me under visual C++ but after I >>>>>>asked to get it for free evaluation and I only got an email that suggest me to >>>>>>contact them by fax or telephone I did not respond(I responded by email but my >>>>>>email was blocked for some reason and I decided that the subject is probably not >>>>>>very important). >>>>>> >>>>>>I think now that it may be important because a chess program may even play well >>>>>>inspite of the fact that it calls killer[-1] so it is possible that I have more >>>>>>mistakes like that. >>>>>> >>>>> >>>>>That probably won't hurt a thing. That move probably would not pass your >>>>>legality check, so even a garbage move would just waste a tiny bit of time >>>>>as you notice it is not legal in the current position. >>>> >>>>Yes but I can still imagine problems. >>>> >>>>1)If I am unlucky a garbage move may be legal so it can be counterproductive. >>>> >>>>2)I thought that garbage may do something worse than giving a random >>>>number. >>>>I thought that if my program try to look at some place that does not exist the >>>>program may crush and not give me a random number or may change another array. >>>> >>>>I also cared not to have -1 >>>> A[x]=1; and not >>>>if (x>=0) >>>>A[x]=1; >>> >>>That doesn't hurt a thing. a[-1] is one "thing" before a[0]. If a is an >>>integer, a[-1] is simply 4 bytes in front of a[0]... >>> >>>> >>>>If you are right then it means that there are cases when I can save time by >>>>doing something like >>>> >>>>A[x]=1; instead of >>>>if (x>=0) >>>>A[x]=1; >>> >>>You can do that just so you _know_ what is in front of A. IE in fortran, >>>arrays go from 1 to N, rather than 0 to N-1 as in C. But in Cray Blitz we >>>wanted to reference a[i] where i could be 0, 1, ... and all we did was make >>>sure that there was a memory word that could safely be zapped, in front of >>>a[1]. We did it like this: >>> >>>common /x/ dummy, a(10) >>> >>>a(1) thru a(10) are normal array references. a(0) actually stores on top of >>>"dummy". >>> >>> >>> >>> >>>> >>>>The point is that if I understand correctly then I understand from your post >>>>that a[x]=1 when x=-1 can not change relevant information. >>> >>>No, it can _definitely_ change something, just not exactly what you think it >>>is changing. :) It will change what is in _front_ of the array. In C, the >>>only way to know what is in front of the array is to put the array in a >>>structure, and then put something right in front of that array declaration >>>to declare the "dummy" space needed for a[-1]. Or a[-2] if you want to go >>>backward even farther. >>> >>> >>> >>>> >>>>If I assume that the condition x>=0 happen in most of the cases then it seems >>>>clear that A[x]=1 is faster. >>> >>>Correct. If you know that -1 <= x <= N, then one dummy word in front of the >>>array will let you eliminate the test. >> >>This was only thinking about a theoretical case but I found other things in my >>code. >> >>In a lot of places in my program >>I have a condition like >> >>while (target!=-1&&info[target]==EMPTY) >> >>In most cases target!=-1 >> >>I thought that I need to do the && in this order >>Do you say that I can change the order without risks? >> >>Suppose that the loop stops in most of the cases because of the fact that >>info[target]=EMPTY. >> >>Does it going to do my program faster or maybe the compiler can detect these >>cases in profile optimazions? >> >>I thought that even checking the value of info[-1] can give an error or change >>some varaible that I do not want. >> >>Uri > >Technically, checking the value of info[-1] could even cause your program to >crash. But in practice, as long as your program has the ability to access the >memory immediately in front of info, it will probably just read the value in >that memory location. > >To be slightly safer, you can declare a padded_info like I suggested elsewhere >in this thread. That way even assignments to info[-1] won't cause a problem -- >on most architectures, with most compilers. > >>while (target!=-1&&info[target]==EMPTY) > >Technically it would be wrong to flip this test around, but in practice you can >probably get away with it. > >Dave originally info is a global array and I have int info[64]; If I understand correctly Based on your example I can use in data.c int PADDED_info[65]; int * const info = PADDED_info+1; I guess that in this case info[-1]=PADDED_info[0] I guess also that in this case I can change the condition to while (info[target]==EMPTY) when info[-1] has a constant value that is different from 0. I also guess that the speed of using info instead of using the original array is the same. Am I correct? I have doubts about the last point because 64 is a nice number and I suspect that my computer will like less 65. 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.