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.