Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Optimizing code

Author: Gerd Isenberg

Date: 14:01:31 05/21/04

Go up one level in this thread


On May 21, 2004 at 16:50:28, Gerd Isenberg wrote:

>On May 21, 2004 at 16:01:57, Dann Corbit wrote:
>
>>On May 21, 2004 at 14:30:51, Dieter Buerssner wrote:
>>
>>>On May 20, 2004 at 21:48:25, Dann Corbit wrote:
>>>
>>>>This is also too low level for the most part, but well worth reading anyway:
>>>>http://www.azillionmonkeys.com/qed/optimize.html
>>>
>>>I had a fast look at this one. Certainly many useful suggestions, but some also
>>>seem doubtful. There is some emphasis on microoptimizations, that probably many
>>>modern compilers will do as well, and perhaps better from the normal code, than
>>>from the already microoptimized code. I also use often do while loops instead of
>>>for (when it is clear that the first comparision in the "end-condition" will
>>>always be true). In the example given in the document, only one out of 100
>>>comparisions will be saved. The prize is, that the data will be accessed from
>>>back to front. I guess on many computers, this will make the code slower.
>>>Suggestions about some floating point optimizations seem dangerous.
>>
>>I agree that some of the stuff might be a little dubious, and I think the
>>"tweaking" angle is way too strong.  But when it comes to making something fast,
>>Paul is very good at it.  Algorithms are the sensible way to optimize.  But if
>>you can't find a better one (anyone figured out how to make chess polynomial
>>time yet instead of exponential?) then some of his ideas are rather useful.
>
>His "loop hoisting" example for instance - throwing out invariant exclusive
>(if-else) conditions out of the loop body and doing exclusive cheap loop bodies
>- seems obvious and i guess many compilers will do the job.
>
>But what about none disjoint conditions inside the loop, considering todays
>branch prediction heuristics?
>
>for (int i=0; i < N; ++i)
>{
>  if (invariantCondition1_probability1() )
>     doSomething1(i);
>  if (invariantCondition2_probability2() )
>     doSomething2(i);
>  ...
>  if (invariantConditionj_probabilityj() )
>     doSomethingj(i);
>}
>
>versus
>
>if (invariantCondition1_probability1() ){
>  for (int i=0; i < N; ++i)
>     doSomething1(i);
>}
>if (invariantCondition1_probability2() ) {
>  for (int i=0; i < N; ++i)
>     doSomething2(i);
>}
>...
>if (invariantConditionj_probabilityj() ) {
>  for (int i=0; i < N; ++i)
>     doSomethingj(i);
>}
>
>isn't that clear and depends a lot on N,j, and the vectors of average
>probability of the conditions, and the expense of condition bodies.
>Does PGO from intel C++ and new MSC++ (PGO ?) or even GCC cover such loop
>hoistings?

Another idea is to use combined conditions to get one exclusive loop:
eg. for j == 1

if (invariantCondition1_probability1() )
{
  if (invariantCondition2_probability2() )
  {
    for (int i=0; i < N; ++i)
      doSomething1(i);
      doSomething2(i);
  }
  else
  {
    for (int i=0; i < N; ++i)
      doSomething1(i);
  }
}
else if (invariantCondition2_probability2() )
{
  for (int i=0; i < N; ++i)
     doSomething2(i);
}




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.