Author Topic: Benchmarking looks suspiciously incorrect  (Read 4540 times)

0 Members and 1 Guest are viewing this topic.

Offline rain_storm

  • Here comes the Rain
  • DBF Aficionado
  • ******
  • Posts: 3088
  • Karma: 182
  • Rain never hurt nobody
    • View Profile
    • org_100h
Benchmarking looks suspiciously incorrect
« on: February 20, 2011 »
The Fast Inverse Squareroot calculates an approximation of 1.0f/sqrt(x) in
less time than it takes to calculate a floating point division.

By squaring the input the routine can be adapted to calculate 1.0f/sqrt(x*x)
which is effectively calculating the same thing as 1.0f/x, I call this the
Fast Inverse Division. Theres just one snag... the sign bit.

By squaring the input you force the value to be positive. However restoring
the proper sign is a trivial fix which requires neither a comparison nor
inline asm.

Code: [Select]
float InvSqrt(float x) {             // compute 1.0f/sqrt(x)
float xhalf = 0.5f * x;          //
int i = *(int*)&x;               // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1);       // initial guess for Newton's method
x = *(float*)&i;                 // convert new bits into float
x = x*(1.5f - xhalf*x*x);        // One round of Newton's method
return x;
}

float InvDiv(float n) {               // compute 1.0f/n
int s = (*(int*)&n) & 0x80000000; // extract the sign bit of the input
float x = n*n;                    // square the input
float xhalf = 0.5f * x;           //
int i = *(int*)&x;                // store floating-point bits in integer
i = (0x5f3759d5 - (i >> 1)) | s;  // initial guess for Newton's method and reapply the sign bit
x = *(float*)&i;                  // convert new bits into float
x = x*(1.5f - xhalf*x*x);         // One round of Newton's method
return x;                         //
}

The result is an approximation of 1.0f/n. Now I know that under ideal conditions
division can be computed in close to the same ammount of time as multiplication.
This is possible only when dividing by a power of two inside a heavily optimized
pipeline. But in the real world division is a thing best avoided.

I wanted to stress test this modified routine to see how it really performs. The
problem is that I've never benchmarked accurately before. I usually just apply an
optimization and run. It should become obvious if the optimization was effective.

So first I decided to clock a loop that merely converted an int to a float and
accumulated the result. The time taken to do all that would be subtracted from the
tick count for each test, This should eliminate the time not spent performing the
calculation i wanted to benchmark. Here's what I came up with:

Code: [Select]
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>

float InvSqrt(float x) {             // compute 1.0f/sqrt(x)
float xhalf = 0.5f * x;          //
int i = *(int*)&x;               // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1);       // initial guess for Newton's method
x = *(float*)&i;                 // convert new bits into float
x = x*(1.5f - xhalf*x*x);        // One round of Newton's method
return x;
}

float InvDiv(float n) {               // compute 1.0f/n
int s = (*(int*)&n) & 0x80000000; // extract the sign bit of the input
float x = n*n;                    // square the input
float xhalf = 0.5f * x;           //
int i = *(int*)&x;                // store floating-point bits in integer
i = (0x5f3759d5 - (i >> 1)) | s;  // initial guess for Newton's method and reapply the sign bit
x = *(float*)&i;                  // convert new bits into float
x = x*(1.5f - xhalf*x*x);         // One round of Newton's method
return x;                         //
}

int main(void) {
DWORD oldTick, newTick, numTick, nopTick;
int iterations = 100000000;
float result = 0.0f;

// empty loop
printf("running 100,000,000 iterations of empty loop\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float x = float(a);
result += x;
}
newTick = GetTickCount();
nopTick = newTick - oldTick;
printf("  oldTick = 0x%08X (%u)\n", oldTick, oldTick);
printf("  newTick = 0x%08X (%u)\n", newTick, newTick);
printf("  nopTick = 0x%08X (%u)\n", nopTick, nopTick);
printf("\n");

// floating point 1.0f/sqrt(x)
printf("running 100,000,000 iterations of 1.0f/sqrt(x)\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float x = 1.0f/sqrt(float(a));
result += x;
}
newTick = GetTickCount();
numTick = newTick - oldTick - nopTick;
printf("  oldTick = 0x%08X (%u)\n", oldTick, oldTick);
printf("  newTick = 0x%08X (%u)\n", newTick, newTick);
printf("  numTick = 0x%08X (%u)\n", numTick, numTick);
printf("\n");

// InvSqrt(x)
printf("running 100,000,000 iterations of InvSqrt(x)\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float x = float(a);
float xhalf = 0.5f * x;          //
int i = *(int*)&x;               // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1);       // initial guess for Newton's method
x = *(float*)&i;                 // convert new bits into float
x = x*(1.5f - xhalf*x*x);        // One round of Newton's method
result += x;
}
newTick = GetTickCount();
numTick = newTick - oldTick - nopTick;
printf("  oldTick = 0x%08X (%u)\n", oldTick, oldTick);
printf("  newTick = 0x%08X (%u)\n", newTick, newTick);
printf("  numTick = 0x%08X (%u)\n", numTick, numTick);
printf("\n");

// floating point 1.0f/x
printf("running 100,000,000 iterations of 1.0f/x\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float x = 1.0f/float(a);
result += x;
}
newTick = GetTickCount();
numTick = newTick - oldTick - nopTick;
printf("  oldTick = 0x%08X (%u)\n", oldTick, oldTick);
printf("  newTick = 0x%08X (%u)\n", newTick, newTick);
printf("  numTick = 0x%08X (%u)\n", numTick, numTick);
printf("\n");

// InvSqrt(x)
printf("running 100,000,000 iterations of InvDiv(x)\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float n = float(a);
int s = (*(int*)&n) & 0x80000000; // extract the sign bit of the input
float x = n*n;                    // square the input
float xhalf = 0.5f * x;           //
int i = *(int*)&x;                // store floating-point bits in integer
i = (0x5f3759d5 - (i >> 1)) | s;  // initial guess for Newton's method and reapply the sign bit
x = *(float*)&i;                  // convert new bits into float
x = x*(1.5f - xhalf*x*x);         // One round of Newton's method
result += x;
}
newTick = GetTickCount();
numTick = newTick - oldTick - nopTick;
printf("  oldTick = 0x%08X (%u)\n", oldTick, oldTick);
printf("  newTick = 0x%08X (%u)\n", newTick, newTick);
printf("  numTick = 0x%08X (%u)\n", numTick, numTick);
printf("\n");

_getch();
printf("%u\n", result);
return 0;
}

results
Code: [Select]
2609 ticks per 100,000,000 iterations 1.0f/sqrt(x)
 391 ticks per 100,000,000 iterations InvSqrt(x)
 422 ticks per 100,000,000 iterations 1.0f/x
1203 ticks per 100,000,000 iterations InvDiv(x)

that cant be correct can it? You'd think it would take more than a 422 ticks to
compute 100,000,000 divisions

Challenge Trophies Won:

Offline Xetick

  • Atari ST
  • ***
  • Posts: 132
  • Karma: 80
    • View Profile
    • Plane9
Re: Benchmarking looks suspiciously incorrect
« Reply #1 on: February 20, 2011 »
A few things.

1. Your not using 'result' so most likely the compiler is just optimizing away everything. Try to print it between each run so your sure its calculated correctly. By printing it you will also see if you actually get the result you expect.
2. Checking the generated assembly when doing these low lever optimizations is usually a good idea
3. GetTickCount is very inexact (10-16ms). Use query performance counter/the RDTSC instruction to get more exact times

Plane9 - Home of the Plane9 3d screensaver/music visualizer
Challenge Trophies Won:

Offline LittleWhite

  • Senior Member
  • Amiga 1200
  • ********
  • Posts: 418
  • Karma: 31
  • It's me!
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #2 on: February 20, 2011 »
Oh .... Xetick exactly said everything (and even more) that I wanted to say.
I would like to really insist on the fact that you have a C code, and C code is compiled. The compilers are doing so great job nowadays that ... I can't say a benchmark is efficient on such case.
Maybe under GNU/Linux with gprof ... you can try to see thing ... but it's a profiler and not a benchmark.
The demoscene will never die, never!

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #3 on: February 20, 2011 »
He's definitely using the value of result in the printf at the end, and over 100million iterations means GetTickCount should be just fine.
I ran the test exe on my netbook:
2761ms
20093ms
5179ms
7676ms
7800ms
That looks reasonable to me.
I wonder what is happening on rain_storm's PC?  Your code is obviously slightly different, have you accidentally caused an fpu exception somewhere in your calcs which has messed up the timings - a division by zero or an underflow, for instance.  The fact it appears to print 0 for result might indicate that.

Jim
« Last Edit: February 20, 2011 by Jim »
Challenge Trophies Won:

Offline rain_storm

  • Here comes the Rain
  • DBF Aficionado
  • ******
  • Posts: 3088
  • Karma: 182
  • Rain never hurt nobody
    • View Profile
    • org_100h
Re: Benchmarking looks suspiciously incorrect
« Reply #4 on: February 21, 2011 »
All the loops begin at 1 and runs up to and including 100,000,000 so division by zero is not the problem. I can't see NANs being a problem either the range is well defined.

Im of the belief that compilers do not always do a good job. If you write poor c code, it will be translated into poor machine code. simple as that. I've seen far too many snippets of very poor code generated by gcc and VC. They're niave in how they manage the FPU stack. They aren't great at SSE or MMX neither. And stupid things like placing many data items initialized to zero before data items initialized to a specific value that one always pisses me off because you could end up spanning 1024 bytes for a sector that would fit into 512 bytes.

Humans spend hours/days/weeks optimizing a program, but we do a far better job at our snails pace than any compiler, and I'm not even talking about dropping down to assembler.

I say that verifying your optimizations is more important now then it ever was. The architectures of today are not as restrictive as yesteryear but the driving force nowadays is rediculously high expectations. The bar has been raised higher then its ever been and this is the standard we have to aim for.

Jims results look more like I was expecting to see, But I am still baffled at why I'm only getting approx 390 ticks for this number of divisions on my PC. and disappointed that the idea turned out to be slower than just doing it in hardware. Well it was worth a shot.

Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #5 on: February 21, 2011 »
Out of curiosity I worked through the sqrt(x*x) example by hand with 100,000,000.  It was very well defined and came up with
9.989x10^-9 or 1/100103825
which is not bad at all.  I definitely didn't expect it to work with such a large range of numbers.

I don't think this C code is bad at all, and if you feed a C compiler valid code the compiler should do something sane otherwise it is broken.  But it doesn't (as you say) have to generate good or fast code - I can't see it beating a modern cpu div instruction.

I'd still like to get to the bottom of your timings though.

Jim
Challenge Trophies Won:

Offline rain_storm

  • Here comes the Rain
  • DBF Aficionado
  • ******
  • Posts: 3088
  • Karma: 182
  • Rain never hurt nobody
    • View Profile
    • org_100h
Re: Benchmarking looks suspiciously incorrect
« Reply #6 on: February 22, 2011 »
All of the loops are unrolled to 10 iterations. This meathod of benchmarking is already getting off on the wrong foot. That means that subtracting the time taken for the empty loop isn't accurate at all. And the hardware versions keep the loop counter in the FPU stack so the time taken to load and store over 10 unrolled iterations is stolen with not so much as a "by your leave". Its not possible for InvSqrt and InvDiv to keep their value in the stack as some integer magic has to be performed, so they don't benefit from these unrolled loops to the same extent as the hardware versions.

But the version I posted was a release build so I recompiled in debug mode and got something more consistent that can be used but is very inefficient compared to the optimized version which is what I really want to test

the 1.0/x loop is roughly 500ms thats around 1/32 the speed of 1.0/sqrt(x) which is over 16000ms. Does that look right. I don't think a sqrt is quite that slow, division is slow enough, 32 divisions is just painful

Code: [Select]
1000ms empty loop
16125ms 1.0/sqrt(x)
 1235ms InvSqrt(x)
  496ms 1.0/x
 2125ms InvDiv(x)

Lesson learnt this meathod of benchmarking is not the way to go about it. I do need to use RDTSC.

If I build in debug mode I get the loop behaving as I want but the functional block is not great. If I build in release mode the functional block is excellent but the loops are unuseable.
« Last Edit: February 22, 2011 by rain_storm »

Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #7 on: February 22, 2011 »
On my quad core i7 laptop
453
2074
155
359
342

empty loop is slow!

Jim
Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #8 on: February 23, 2011 »
I looked into this more. Here is the (relevant) disassembly of your executable:
Code: [Select]

for (int a = 1; a <= iterations; a++) {
float x = float(a);
result += x;
}


?_0002: lea     ecx, [eax-2H]                           ; 00401033 _ 8D. 48, FE
        mov     dword ptr [esp+3CH], ecx                ; 00401036 _ 89. 4C 24, 3C
        fild    dword ptr [esp+3CH]                     ; 0040103A _ DB. 44 24, 3C
        lea     edx, [eax-1H]                           ; 0040103E _ 8D. 50, FF
        lea     ecx, [eax+1H]                           ; 00401041 _ 8D. 48, 01
        fadd    dword ptr [esp+30H]                     ; 00401044 _ D8. 44 24, 30
        fstp    dword ptr [esp+3CH]                     ; 00401048 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040104C _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401050 _ 89. 54 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 00401054 _ DA. 44 24, 3C
        lea     edx, [eax+2H]                           ; 00401058 _ 8D. 50, 02
        fstp    dword ptr [esp+3CH]                     ; 0040105B _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040105F _ D9. 44 24, 3C
        fiadd   dword ptr [esp+38H]                     ; 00401063 _ DA. 44 24, 38
        fstp    dword ptr [esp+3CH]                     ; 00401067 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040106B _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 0040106F _ 89. 4C 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 00401073 _ DA. 44 24, 3C
        lea     ecx, [eax+3H]                           ; 00401077 _ 8D. 48, 03
        fstp    dword ptr [esp+3CH]                     ; 0040107A _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040107E _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401082 _ 89. 54 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 00401086 _ DA. 44 24, 3C
        lea     edx, [eax+4H]                           ; 0040108A _ 8D. 50, 04
        fstp    dword ptr [esp+3CH]                     ; 0040108D _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401091 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 00401095 _ 89. 4C 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 00401099 _ DA. 44 24, 3C
        lea     ecx, [eax+5H]                           ; 0040109D _ 8D. 48, 05
        fstp    dword ptr [esp+3CH]                     ; 004010A0 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004010A4 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 004010A8 _ 89. 54 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 004010AC _ DA. 44 24, 3C
        lea     edx, [eax+6H]                           ; 004010B0 _ 8D. 50, 06
        fstp    dword ptr [esp+3CH]                     ; 004010B3 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004010B7 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004010BB _ 89. 4C 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 004010BF _ DA. 44 24, 3C
        lea     ecx, [eax+7H]                           ; 004010C3 _ 8D. 48, 07
        add     eax, 10                                 ; 004010C6 _ 83. C0, 0A
        mov     dword ptr [esp+38H], eax                ; 004010C9 _ 89. 44 24, 38
        fstp    dword ptr [esp+3CH]                     ; 004010CD _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004010D1 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 004010D5 _ 89. 54 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 004010D9 _ DA. 44 24, 3C
        lea     edx, [eax-2H]                           ; 004010DD _ 8D. 50, FE
        cmp     edx, 100000000                          ; 004010E0 _ 81. FA, 05F5E100
        fstp    dword ptr [esp+3CH]                     ; 004010E6 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004010EA _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004010EE _ 89. 4C 24, 3C
        fiadd   dword ptr [esp+3CH]                     ; 004010F2 _ DA. 44 24, 3C
        fstp    dword ptr [esp+30H]                     ; 004010F6 _ D9. 5C 24, 30
        jle     ?_0002

for (int a = 1; a <= iterations; a++) {
float x = 1.0f/sqrt(float(a));
result += x;
}

?_0003: fild    dword ptr [esp+34H]                     ; 00401160 _ DB. 44 24, 34
        call    ?_1563                                  ; 00401164 _ E8, 000096D7
        fstp    dword ptr [esp+3CH]                     ; 00401169 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040116D _ D9. 44 24, 3C
        inc     ebx                                     ; 00401171 _ 43
        cmp     ebx, 100000000                          ; 00401172 _ 81. FB, 05F5E100
        fld1                                            ; 00401178 _ D9. E8
        fdivrp  st(1), st(0)                            ; 0040117A _ DE. F1
        mov     dword ptr [esp+34H], ebx                ; 0040117C _ 89. 5C 24, 34
        fstp    dword ptr [esp+3CH]                     ; 00401180 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401184 _ D9. 44 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401188 _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 0040118C _ D9. 5C 24, 30
        jle     ?_0003

for (int a = 1; a <= iterations; a++) {
float x = float(a);
float xhalf = 0.5f * x;          //
int i = *(int*)&x;               // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1);       // initial guess for Newton's method
x = *(float*)&i;                 // convert new bits into float
x = x*(1.5f - xhalf*x*x);        // One round of Newton's method
result += x;
}

?_0004: lea     ecx, [eax-2H]                           ; 00401202 _ 8D. 48, FE
        mov     dword ptr [esp+34H], ecx                ; 00401205 _ 89. 4C 24, 34
        fild    dword ptr [esp+34H]                     ; 00401209 _ DB. 44 24, 34
        mov     ecx, 1597462997                         ; 0040120D _ B9, 5F3759D5
        fstp    dword ptr [esp+2CH]                     ; 00401212 _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401216 _ D9. 44 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 0040121A _ 8B. 54 24, 2C
        fmul    st(0), st(2)                            ; 0040121E _ D8. CA
        sar     edx, 1                                  ; 00401220 _ D1. FA
        sub     ecx, edx                                ; 00401222 _ 2B. CA
        mov     dword ptr [esp+2CH], ecx                ; 00401224 _ 89. 4C 24, 2C
        fstp    dword ptr [esp+34H]                     ; 00401228 _ D9. 5C 24, 34
        lea     edx, [eax-1H]                           ; 0040122C _ 8D. 50, FF
        fld     dword ptr [esp+34H]                     ; 0040122F _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 00401233 _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401237 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401239 _ DE. CA
        fld     st(0)                                   ; 0040123B _ D9. C0
        fmulp   st(2), st(0)                            ; 0040123D _ DE. CA
        fld     st(2)                                   ; 0040123F _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401241 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401243 _ DE. C9
        fstp    dword ptr [esp+34H]                     ; 00401245 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401249 _ D9. 44 24, 34
        mov     dword ptr [esp+34H], edx                ; 0040124D _ 89. 54 24, 34
        fadd    dword ptr [esp+30H]                     ; 00401251 _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 00401255 _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 0040125A _ D9. 5C 24, 30
        fild    dword ptr [esp+34H]                     ; 0040125E _ DB. 44 24, 34
        fstp    dword ptr [esp+2CH]                     ; 00401262 _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401266 _ D9. 44 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 0040126A _ 8B. 4C 24, 2C
        fmul    st(0), st(2)                            ; 0040126E _ D8. CA
        sar     ecx, 1                                  ; 00401270 _ D1. F9
        sub     edx, ecx                                ; 00401272 _ 2B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401274 _ 89. 54 24, 2C
        fstp    dword ptr [esp+34H]                     ; 00401278 _ D9. 5C 24, 34
        mov     edx, 1597462997                         ; 0040127C _ BA, 5F3759D5
        fld     dword ptr [esp+34H]                     ; 00401281 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 00401285 _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401289 _ D9. C0
        fmulp   st(2), st(0)                            ; 0040128B _ DE. CA
        fld     st(0)                                   ; 0040128D _ D9. C0
        fmulp   st(2), st(0)                            ; 0040128F _ DE. CA
        fld     st(2)                                   ; 00401291 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401293 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401295 _ DE. C9
        fstp    dword ptr [esp+34H]                     ; 00401297 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 0040129B _ D9. 44 24, 34
        fadd    dword ptr [esp+30H]                     ; 0040129F _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 004012A3 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004012A7 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 004012AB _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004012AF _ D9. 44 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 004012B3 _ 8B. 4C 24, 2C
        fmul    st(0), st(2)                            ; 004012B7 _ D8. CA
        sar     ecx, 1                                  ; 004012B9 _ D1. F9
        sub     edx, ecx                                ; 004012BB _ 2B. D1
        mov     dword ptr [esp+2CH], edx                ; 004012BD _ 89. 54 24, 2C
        fstp    dword ptr [esp+34H]                     ; 004012C1 _ D9. 5C 24, 34
        lea     ecx, [eax+1H]                           ; 004012C5 _ 8D. 48, 01
        fld     dword ptr [esp+34H]                     ; 004012C8 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 004012CC _ D9. 44 24, 2C
        fld     st(0)                                   ; 004012D0 _ D9. C0
        fmulp   st(2), st(0)                            ; 004012D2 _ DE. CA
        fld     st(0)                                   ; 004012D4 _ D9. C0
        fmulp   st(2), st(0)                            ; 004012D6 _ DE. CA
        fld     st(2)                                   ; 004012D8 _ D9. C2
        fsubrp  st(2), st(0)                            ; 004012DA _ DE. E2
        fmulp   st(1), st(0)                            ; 004012DC _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 004012DE _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004012E2 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004012E6 _ 89. 4C 24, 3C
        fadd    dword ptr [esp+30H]                     ; 004012EA _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 004012EE _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004012F2 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 004012F6 _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004012FA _ D9. 44 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 004012FE _ 8B. 54 24, 2C
        fmul    st(0), st(2)                            ; 00401302 _ D8. CA
        fstp    dword ptr [esp+34H]                     ; 00401304 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401308 _ D9. 44 24, 34
        sar     edx, 1                                  ; 0040130C _ D1. FA
        mov     ecx, 1597462997                         ; 0040130E _ B9, 5F3759D5
        sub     ecx, edx                                ; 00401313 _ 2B. CA
        mov     dword ptr [esp+2CH], ecx                ; 00401315 _ 89. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401319 _ D9. 44 24, 2C
        lea     edx, [eax+2H]                           ; 0040131D _ 8D. 50, 02
        fld     st(0)                                   ; 00401320 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401322 _ DE. CA
        fld     st(0)                                   ; 00401324 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401326 _ DE. CA
        fld     st(2)                                   ; 00401328 _ D9. C2
        fsubrp  st(2), st(0)                            ; 0040132A _ DE. E2
        fmulp   st(1), st(0)                            ; 0040132C _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040132E _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401332 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401336 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 0040133A _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 0040133E _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401343 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401347 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 0040134B _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040134F _ D9. 44 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401353 _ 8B. 4C 24, 2C
        fmul    st(0), st(2)                            ; 00401357 _ D8. CA
        sar     ecx, 1                                  ; 00401359 _ D1. F9
        sub     edx, ecx                                ; 0040135B _ 2B. D1
        mov     dword ptr [esp+2CH], edx                ; 0040135D _ 89. 54 24, 2C
        fstp    dword ptr [esp+34H]                     ; 00401361 _ D9. 5C 24, 34
        lea     ecx, [eax+3H]                           ; 00401365 _ 8D. 48, 03
        fld     dword ptr [esp+34H]                     ; 00401368 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 0040136C _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401370 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401372 _ DE. CA
        fld     st(0)                                   ; 00401374 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401376 _ DE. CA
        fld     st(2)                                   ; 00401378 _ D9. C2
        fsubrp  st(2), st(0)                            ; 0040137A _ DE. E2
        fmulp   st(1), st(0)                            ; 0040137C _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040137E _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401382 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 00401386 _ 89. 4C 24, 3C
        fadd    dword ptr [esp+30H]                     ; 0040138A _ D8. 44 24, 30
        mov     ecx, 1597462997                         ; 0040138E _ B9, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401393 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401397 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 0040139B _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040139F _ D9. 44 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 004013A3 _ 8B. 54 24, 2C
        fmul    st(0), st(2)                            ; 004013A7 _ D8. CA
        sar     edx, 1                                  ; 004013A9 _ D1. FA
        sub     ecx, edx                                ; 004013AB _ 2B. CA
        mov     dword ptr [esp+2CH], ecx                ; 004013AD _ 89. 4C 24, 2C
        fstp    dword ptr [esp+34H]                     ; 004013B1 _ D9. 5C 24, 34
        lea     edx, [eax+4H]                           ; 004013B5 _ 8D. 50, 04
        fld     dword ptr [esp+34H]                     ; 004013B8 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 004013BC _ D9. 44 24, 2C
        fld     st(0)                                   ; 004013C0 _ D9. C0
        fmulp   st(2), st(0)                            ; 004013C2 _ DE. CA
        fld     st(0)                                   ; 004013C4 _ D9. C0
        fmulp   st(2), st(0)                            ; 004013C6 _ DE. CA
        fld     st(2)                                   ; 004013C8 _ D9. C2
        fsubrp  st(2), st(0)                            ; 004013CA _ DE. E2
        fmulp   st(1), st(0)                            ; 004013CC _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 004013CE _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004013D2 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 004013D6 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 004013DA _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 004013DE _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 004013E3 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004013E7 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 004013EB _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004013EF _ D9. 44 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 004013F3 _ 8B. 4C 24, 2C
        fmul    st(0), st(2)                            ; 004013F7 _ D8. CA
        sar     ecx, 1                                  ; 004013F9 _ D1. F9
        sub     edx, ecx                                ; 004013FB _ 2B. D1
        mov     dword ptr [esp+2CH], edx                ; 004013FD _ 89. 54 24, 2C
        fstp    dword ptr [esp+34H]                     ; 00401401 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401405 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 00401409 _ D9. 44 24, 2C
        fld     st(0)                                   ; 0040140D _ D9. C0
        lea     ecx, [eax+5H]                           ; 0040140F _ 8D. 48, 05
        fmulp   st(2), st(0)                            ; 00401412 _ DE. CA
        fld     st(0)                                   ; 00401414 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401416 _ DE. CA
        fld     st(2)                                   ; 00401418 _ D9. C2
        fsubrp  st(2), st(0)                            ; 0040141A _ DE. E2
        fmulp   st(1), st(0)                            ; 0040141C _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040141E _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401422 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 00401426 _ 89. 4C 24, 3C
        fadd    dword ptr [esp+30H]                     ; 0040142A _ D8. 44 24, 30
        mov     ecx, 1597462997                         ; 0040142E _ B9, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401433 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401437 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 0040143B _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040143F _ D9. 44 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 00401443 _ 8B. 54 24, 2C
        fmul    st(0), st(2)                            ; 00401447 _ D8. CA
        sar     edx, 1                                  ; 00401449 _ D1. FA
        sub     ecx, edx                                ; 0040144B _ 2B. CA
        mov     dword ptr [esp+2CH], ecx                ; 0040144D _ 89. 4C 24, 2C
        fstp    dword ptr [esp+34H]                     ; 00401451 _ D9. 5C 24, 34
        lea     edx, [eax+6H]                           ; 00401455 _ 8D. 50, 06
        fld     dword ptr [esp+34H]                     ; 00401458 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 0040145C _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401460 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401462 _ DE. CA
        fld     st(0)                                   ; 00401464 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401466 _ DE. CA
        fld     st(2)                                   ; 00401468 _ D9. C2
        fsubrp  st(2), st(0)                            ; 0040146A _ DE. E2
        fmulp   st(1), st(0)                            ; 0040146C _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040146E _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401472 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401476 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 0040147A _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 0040147E _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401483 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401487 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 0040148B _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040148F _ D9. 44 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401493 _ 8B. 4C 24, 2C
        fmul    st(0), st(2)                            ; 00401497 _ D8. CA
        sar     ecx, 1                                  ; 00401499 _ D1. F9
        sub     edx, ecx                                ; 0040149B _ 2B. D1
        mov     dword ptr [esp+2CH], edx                ; 0040149D _ 89. 54 24, 2C
        fstp    dword ptr [esp+34H]                     ; 004014A1 _ D9. 5C 24, 34
        lea     ecx, [eax+7H]                           ; 004014A5 _ 8D. 48, 07
        fld     dword ptr [esp+34H]                     ; 004014A8 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 004014AC _ D9. 44 24, 2C
        fld     st(0)                                   ; 004014B0 _ D9. C0
        fmulp   st(2), st(0)                            ; 004014B2 _ DE. CA
        fld     st(0)                                   ; 004014B4 _ D9. C0
        fmulp   st(2), st(0)                            ; 004014B6 _ DE. CA
        fld     st(2)                                   ; 004014B8 _ D9. C2
        fsubrp  st(2), st(0)                            ; 004014BA _ DE. E2
        fmulp   st(1), st(0)                            ; 004014BC _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 004014BE _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004014C2 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004014C6 _ 89. 4C 24, 3C
        fadd    dword ptr [esp+30H]                     ; 004014CA _ D8. 44 24, 30
        mov     ecx, 1597462997                         ; 004014CE _ B9, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 004014D3 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004014D7 _ DB. 44 24, 3C
        fstp    dword ptr [esp+2CH]                     ; 004014DB _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004014DF _ D9. 44 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 004014E3 _ 8B. 54 24, 2C
        fmul    st(0), st(2)                            ; 004014E7 _ D8. CA
        sar     edx, 1                                  ; 004014E9 _ D1. FA
        sub     ecx, edx                                ; 004014EB _ 2B. CA
        mov     dword ptr [esp+2CH], ecx                ; 004014ED _ 89. 4C 24, 2C
        fstp    dword ptr [esp+34H]                     ; 004014F1 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004014F5 _ D9. 44 24, 34
        fld     dword ptr [esp+2CH]                     ; 004014F9 _ D9. 44 24, 2C
        fld     st(0)                                   ; 004014FD _ D9. C0
        fmulp   st(2), st(0)                            ; 004014FF _ DE. CA
        fld     st(0)                                   ; 00401501 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401503 _ DE. CA
        fld     st(2)                                   ; 00401505 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401507 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401509 _ DE. C9
        add     eax, 10                                 ; 0040150B _ 83. C0, 0A
        lea     edx, [eax-2H]                           ; 0040150E _ 8D. 50, FE
        cmp     edx, 100000000                          ; 00401511 _ 81. FA, 05F5E100
        fstp    dword ptr [esp+3CH]                     ; 00401517 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040151B _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], eax                ; 0040151F _ 89. 44 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401523 _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 00401527 _ D9. 5C 24, 30
        jle     ?_0004                                  ; 0040152B _ 0F 8E, FFFFFCD1
« Last Edit: February 23, 2011 by Jim »
Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #9 on: February 23, 2011 »
Code: [Select]
// floating point 1.0f/x
printf("running 100,000,000 iterations of 1.0f/x\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float x = 1.0f/float(a);
result += x;
}

?_0005: lea     ecx, [eax-2H]                           ; 0040159B _ 8D. 48, FE
        mov     dword ptr [esp+34H], ecx                ; 0040159E _ 89. 4C 24, 34
        fild    dword ptr [esp+34H]                     ; 004015A2 _ DB. 44 24, 34
        lea     edx, [eax-1H]                           ; 004015A6 _ 8D. 50, FF
        lea     ecx, [eax+1H]                           ; 004015A9 _ 8D. 48, 01
        fdivr   st(0), st(1)                            ; 004015AC _ D8. F9
        fstp    dword ptr [esp+34H]                     ; 004015AE _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004015B2 _ D9. 44 24, 34
        fadd    dword ptr [esp+30H]                     ; 004015B6 _ D8. 44 24, 30
        fstp    dword ptr [esp+34H]                     ; 004015BA _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004015BE _ D9. 44 24, 34
        mov     dword ptr [esp+34H], edx                ; 004015C2 _ 89. 54 24, 34
        fild    dword ptr [esp+34H]                     ; 004015C6 _ DB. 44 24, 34
        lea     edx, [eax+2H]                           ; 004015CA _ 8D. 50, 02
        fdivr   st(0), st(2)                            ; 004015CD _ D8. FA
        fstp    dword ptr [esp+34H]                     ; 004015CF _ D9. 5C 24, 34
        fadd    dword ptr [esp+34H]                     ; 004015D3 _ D8. 44 24, 34
        fstp    dword ptr [esp+34H]                     ; 004015D7 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004015DB _ D9. 44 24, 34
        fild    dword ptr [esp+3CH]                     ; 004015DF _ DB. 44 24, 3C
        fdivr   st(0), st(2)                            ; 004015E3 _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 004015E5 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 004015E9 _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 004015ED _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004015F1 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004015F5 _ 89. 4C 24, 3C
        fild    dword ptr [esp+3CH]                     ; 004015F9 _ DB. 44 24, 3C
        lea     ecx, [eax+3H]                           ; 004015FD _ 8D. 48, 03
        fdivr   st(0), st(2)                            ; 00401600 _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 00401602 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 00401606 _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 0040160A _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040160E _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401612 _ 89. 54 24, 3C
        fild    dword ptr [esp+3CH]                     ; 00401616 _ DB. 44 24, 3C
        lea     edx, [eax+4H]                           ; 0040161A _ 8D. 50, 04
        fdivr   st(0), st(2)                            ; 0040161D _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 0040161F _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 00401623 _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 00401627 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040162B _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 0040162F _ 89. 4C 24, 3C
        fild    dword ptr [esp+3CH]                     ; 00401633 _ DB. 44 24, 3C
        lea     ecx, [eax+5H]                           ; 00401637 _ 8D. 48, 05
        fdivr   st(0), st(2)                            ; 0040163A _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 0040163C _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 00401640 _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 00401644 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401648 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 0040164C _ 89. 54 24, 3C
        fild    dword ptr [esp+3CH]                     ; 00401650 _ DB. 44 24, 3C
        lea     edx, [eax+6H]                           ; 00401654 _ 8D. 50, 06
        fdivr   st(0), st(2)                            ; 00401657 _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 00401659 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 0040165D _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 00401661 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401665 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 00401669 _ 89. 4C 24, 3C
        fild    dword ptr [esp+3CH]                     ; 0040166D _ DB. 44 24, 3C
        lea     ecx, [eax+7H]                           ; 00401671 _ 8D. 48, 07
        add     eax, 10                                 ; 00401674 _ 83. C0, 0A
        fdivr   st(0), st(2)                            ; 00401677 _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 00401679 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 0040167D _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 00401681 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401685 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401689 _ 89. 54 24, 3C
        fild    dword ptr [esp+3CH]                     ; 0040168D _ DB. 44 24, 3C
        lea     edx, [eax-2H]                           ; 00401691 _ 8D. 50, FE
        fdivr   st(0), st(2)                            ; 00401694 _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 00401696 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 0040169A _ D8. 44 24, 3C
        fstp    dword ptr [esp+3CH]                     ; 0040169E _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004016A2 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], ecx                ; 004016A6 _ 89. 4C 24, 3C
        fild    dword ptr [esp+3CH]                     ; 004016AA _ DB. 44 24, 3C
        fdivr   st(0), st(2)                            ; 004016AE _ D8. FA
        fstp    dword ptr [esp+3CH]                     ; 004016B0 _ D9. 5C 24, 3C
        fadd    dword ptr [esp+3CH]                     ; 004016B4 _ D8. 44 24, 3C
        mov     dword ptr [esp+3CH], eax                ; 004016B8 _ 89. 44 24, 3C
        fstp    dword ptr [esp+30H]                     ; 004016BC _ D9. 5C 24, 30
        cmp     edx, 100000000                          ; 004016C0 _ 81. FA, 05F5E100
        jle     ?_0005                                  ; 004016C6 _ 0F 8E, FFFFFECF
« Last Edit: February 23, 2011 by Jim »
Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #10 on: February 23, 2011 »
Apologies for multiple posts, the disassemblies don't fit in the maximum post size

Code: [Select]
// InvSqrt(x)
printf("running 100,000,000 iterations of InvDiv(x)\n");
oldTick = GetTickCount();
for (int a = 1; a <= iterations; a++) {
float n = float(a);
int s = (*(int*)&n) & 0x80000000; // extract the sign bit of the input
float x = n*n;                    // square the input
float xhalf = 0.5f * x;           //
int i = *(int*)&x;                // store floating-point bits in integer
i = (0x5f3759d5 - (i >> 1)) | s;  // initial guess for Newton's method and reapply the sign bit
x = *(float*)&i;                  // convert new bits into float
x = x*(1.5f - xhalf*x*x);         // One round of Newton's method
result += x;
}


?_0006: lea     ecx, [eax-2H]                           ; 0040173C _ 8D. 48, FE
        mov     dword ptr [esp+38H], ecx                ; 0040173F _ 89. 4C 24, 38
        fild    dword ptr [esp+38H]                     ; 00401743 _ DB. 44 24, 38
        mov     ecx, 1597462997                         ; 00401747 _ B9, 5F3759D5
        fstp    dword ptr [esp+34H]                     ; 0040174C _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401750 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401754 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401756 _ D9. 5C 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 0040175A _ 8B. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040175E _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 00401762 _ D8. CA
        sar     edx, 1                                  ; 00401764 _ D1. FA
        sub     ecx, edx                                ; 00401766 _ 2B. CA
        mov     edx, dword ptr [esp+34H]                ; 00401768 _ 8B. 54 24, 34
        fstp    dword ptr [esp+38H]                     ; 0040176C _ D9. 5C 24, 38
        and     edx, 80000000H                          ; 00401770 _ 81. E2, 80000000
        fld     dword ptr [esp+38H]                     ; 00401776 _ D9. 44 24, 38
        or      ecx, edx                                ; 0040177A _ 0B. CA
        mov     dword ptr [esp+2CH], ecx                ; 0040177C _ 89. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401780 _ D9. 44 24, 2C
        lea     ecx, [eax-1H]                           ; 00401784 _ 8D. 48, FF
        fld     st(0)                                   ; 00401787 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401789 _ DE. CA
        fld     st(0)                                   ; 0040178B _ D9. C0
        fmulp   st(2), st(0)                            ; 0040178D _ DE. CA
        fld     st(2)                                   ; 0040178F _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401791 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401793 _ DE. C9
        fstp    dword ptr [esp+38H]                     ; 00401795 _ D9. 5C 24, 38
        fld     dword ptr [esp+38H]                     ; 00401799 _ D9. 44 24, 38
        mov     dword ptr [esp+38H], ecx                ; 0040179D _ 89. 4C 24, 38
        fadd    dword ptr [esp+30H]                     ; 004017A1 _ D8. 44 24, 30
        mov     ecx, 1597462997                         ; 004017A5 _ B9, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 004017AA _ D9. 5C 24, 30
        fild    dword ptr [esp+38H]                     ; 004017AE _ DB. 44 24, 38
        fstp    dword ptr [esp+34H]                     ; 004017B2 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004017B6 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 004017BA _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 004017BC _ D9. 5C 24, 2C
        mov     edx, dword ptr [esp+2CH]                ; 004017C0 _ 8B. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004017C4 _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 004017C8 _ D8. CA
        sar     edx, 1                                  ; 004017CA _ D1. FA
        sub     ecx, edx                                ; 004017CC _ 2B. CA
        mov     edx, dword ptr [esp+34H]                ; 004017CE _ 8B. 54 24, 34
        fstp    dword ptr [esp+38H]                     ; 004017D2 _ D9. 5C 24, 38
        and     edx, 80000000H                          ; 004017D6 _ 81. E2, 80000000
        fld     dword ptr [esp+38H]                     ; 004017DC _ D9. 44 24, 38
        or      ecx, edx                                ; 004017E0 _ 0B. CA
        mov     dword ptr [esp+2CH], ecx                ; 004017E2 _ 89. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004017E6 _ D9. 44 24, 2C
        mov     edx, 1597462997                         ; 004017EA _ BA, 5F3759D5
        fld     st(0)                                   ; 004017EF _ D9. C0
        fmulp   st(2), st(0)                            ; 004017F1 _ DE. CA
        fld     st(0)                                   ; 004017F3 _ D9. C0
        fmulp   st(2), st(0)                            ; 004017F5 _ DE. CA
        fld     st(2)                                   ; 004017F7 _ D9. C2
        fsubrp  st(2), st(0)                            ; 004017F9 _ DE. E2
        fmulp   st(1), st(0)                            ; 004017FB _ DE. C9
        fstp    dword ptr [esp+38H]                     ; 004017FD _ D9. 5C 24, 38
        fld     dword ptr [esp+38H]                     ; 00401801 _ D9. 44 24, 38
        fadd    dword ptr [esp+30H]                     ; 00401805 _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 00401809 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 0040180D _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 00401811 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401815 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401819 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 0040181B _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 0040181F _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401823 _ D9. 44 24, 2C
        sar     ecx, 1                                  ; 00401827 _ D1. F9
        fmul    st(0), st(2)                            ; 00401829 _ D8. CA
        sub     edx, ecx                                ; 0040182B _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 0040182D _ 8B. 4C 24, 34
        and     ecx, 80000000H                          ; 00401831 _ 81. E1, 80000000
        fstp    dword ptr [esp+38H]                     ; 00401837 _ D9. 5C 24, 38
        fld     dword ptr [esp+38H]                     ; 0040183B _ D9. 44 24, 38
        or      edx, ecx                                ; 0040183F _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401841 _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401845 _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401849 _ D9. C0
        fmulp   st(2), st(0)                            ; 0040184B _ DE. CA
        lea     edx, [eax+1H]                           ; 0040184D _ 8D. 50, 01
        fld     st(0)                                   ; 00401850 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401852 _ DE. CA
        fld     st(2)                                   ; 00401854 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401856 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401858 _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040185A _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040185E _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401862 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401866 _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 0040186A _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 0040186F _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401873 _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 00401877 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 0040187B _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 0040187F _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401881 _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401885 _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401889 _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 0040188D _ D8. CA
        sar     ecx, 1                                  ; 0040188F _ D1. F9
        sub     edx, ecx                                ; 00401891 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 00401893 _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 00401897 _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 0040189B _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 004018A1 _ D9. 44 24, 38
        or      edx, ecx                                ; 004018A5 _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 004018A7 _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004018AB _ D9. 44 24, 2C
        lea     edx, [eax+2H]                           ; 004018AF _ 8D. 50, 02
        fld     st(0)                                   ; 004018B2 _ D9. C0
        fmulp   st(2), st(0)                            ; 004018B4 _ DE. CA
        fld     st(0)                                   ; 004018B6 _ D9. C0
        fmulp   st(2), st(0)                            ; 004018B8 _ DE. CA
        fld     st(2)                                   ; 004018BA _ D9. C2
        fsubrp  st(2), st(0)                            ; 004018BC _ DE. E2
        fmulp   st(1), st(0)                            ; 004018BE _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 004018C0 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004018C4 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 004018C8 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 004018CC _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 004018D0 _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 004018D5 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004018D9 _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 004018DD _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004018E1 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 004018E5 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 004018E7 _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 004018EB _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004018EF _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 004018F3 _ D8. CA
        sar     ecx, 1                                  ; 004018F5 _ D1. F9
        sub     edx, ecx                                ; 004018F7 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 004018F9 _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 004018FD _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 00401901 _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 00401907 _ D9. 44 24, 38
        or      edx, ecx                                ; 0040190B _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 0040190D _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401911 _ D9. 44 24, 2C
        lea     edx, [eax+3H]                           ; 00401915 _ 8D. 50, 03
        fld     st(0)                                   ; 00401918 _ D9. C0
        fmulp   st(2), st(0)                            ; 0040191A _ DE. CA
        fld     st(0)                                   ; 0040191C _ D9. C0
        fmulp   st(2), st(0)                            ; 0040191E _ DE. CA
        fld     st(2)                                   ; 00401920 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401922 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401924 _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 00401926 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 0040192A _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 0040192E _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401932 _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 00401936 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 0040193A _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 0040193E _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401942 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401946 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401948 _ D9. 5C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 0040194C _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 00401950 _ D8. CA
        fstp    dword ptr [esp+38H]                     ; 00401952 _ D9. 5C 24, 38
        mov     ecx, dword ptr [esp+2CH]                ; 00401956 _ 8B. 4C 24, 2C
        fld     dword ptr [esp+38H]                     ; 0040195A _ D9. 44 24, 38
        sar     ecx, 1                                  ; 0040195E _ D1. F9
        mov     edx, 1597462997                         ; 00401960 _ BA, 5F3759D5
        sub     edx, ecx                                ; 00401965 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 00401967 _ 8B. 4C 24, 34
        and     ecx, 80000000H                          ; 0040196B _ 81. E1, 80000000
        or      edx, ecx                                ; 00401971 _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401973 _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401977 _ D9. 44 24, 2C
        lea     edx, [eax+4H]                           ; 0040197B _ 8D. 50, 04
        fld     st(0)                                   ; 0040197E _ D9. C0
        fmulp   st(2), st(0)                            ; 00401980 _ DE. CA
        fld     st(0)                                   ; 00401982 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401984 _ DE. CA
        fld     st(2)                                   ; 00401986 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401988 _ DE. E2
        fmulp   st(1), st(0)                            ; 0040198A _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 0040198C _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401990 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401994 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401998 _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 0040199C _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 004019A1 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 004019A5 _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 004019A9 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 004019AD _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 004019B1 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 004019B3 _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 004019B7 _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004019BB _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 004019BF _ D8. CA
        sar     ecx, 1                                  ; 004019C1 _ D1. F9
        sub     edx, ecx                                ; 004019C3 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 004019C5 _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 004019C9 _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 004019CD _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 004019D3 _ D9. 44 24, 38
        or      edx, ecx                                ; 004019D7 _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 004019D9 _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 004019DD _ D9. 44 24, 2C
        lea     edx, [eax+5H]                           ; 004019E1 _ 8D. 50, 05
        fld     st(0)                                   ; 004019E4 _ D9. C0
        fmulp   st(2), st(0)                            ; 004019E6 _ DE. CA
        fld     st(0)                                   ; 004019E8 _ D9. C0
        fmulp   st(2), st(0)                            ; 004019EA _ DE. CA
        fld     st(2)                                   ; 004019EC _ D9. C2
        fsubrp  st(2), st(0)                            ; 004019EE _ DE. E2
        fmulp   st(1), st(0)                            ; 004019F0 _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 004019F2 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 004019F6 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 004019FA _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 004019FE _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 00401A02 _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401A07 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401A0B _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 00401A0F _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401A13 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401A17 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401A19 _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401A1D _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401A21 _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 00401A25 _ D8. CA
        sar     ecx, 1                                  ; 00401A27 _ D1. F9
        sub     edx, ecx                                ; 00401A29 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 00401A2B _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 00401A2F _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 00401A33 _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 00401A39 _ D9. 44 24, 38
        or      edx, ecx                                ; 00401A3D _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401A3F _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401A43 _ D9. 44 24, 2C
        fld     st(0)                                   ; 00401A47 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401A49 _ DE. CA
        fld     st(0)                                   ; 00401A4B _ D9. C0
        fmulp   st(2), st(0)                            ; 00401A4D _ DE. CA
        fld     st(2)                                   ; 00401A4F _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401A51 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401A53 _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 00401A55 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401A59 _ D9. 44 24, 3C
        lea     edx, [eax+6H]                           ; 00401A5D _ 8D. 50, 06
        fadd    dword ptr [esp+30H]                     ; 00401A60 _ D8. 44 24, 30
        mov     dword ptr [esp+3CH], edx                ; 00401A64 _ 89. 54 24, 3C
        mov     edx, 1597462997                         ; 00401A68 _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401A6D _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401A71 _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 00401A75 _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401A79 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401A7D _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401A7F _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401A83 _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401A87 _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 00401A8B _ D8. CA
        sar     ecx, 1                                  ; 00401A8D _ D1. F9
        sub     edx, ecx                                ; 00401A8F _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 00401A91 _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 00401A95 _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 00401A99 _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 00401A9F _ D9. 44 24, 38
        or      edx, ecx                                ; 00401AA3 _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401AA5 _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401AA9 _ D9. 44 24, 2C
        lea     edx, [eax+7H]                           ; 00401AAD _ 8D. 50, 07
        fld     st(0)                                   ; 00401AB0 _ D9. C0
        add     eax, 10                                 ; 00401AB2 _ 83. C0, 0A
        fmulp   st(2), st(0)                            ; 00401AB5 _ DE. CA
        fld     st(0)                                   ; 00401AB7 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401AB9 _ DE. CA
        fld     st(2)                                   ; 00401ABB _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401ABD _ DE. E2
        fmulp   st(1), st(0)                            ; 00401ABF _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 00401AC1 _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401AC5 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], edx                ; 00401AC9 _ 89. 54 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401ACD _ D8. 44 24, 30
        mov     edx, 1597462997                         ; 00401AD1 _ BA, 5F3759D5
        fstp    dword ptr [esp+30H]                     ; 00401AD6 _ D9. 5C 24, 30
        fild    dword ptr [esp+3CH]                     ; 00401ADA _ DB. 44 24, 3C
        fstp    dword ptr [esp+34H]                     ; 00401ADE _ D9. 5C 24, 34
        fld     dword ptr [esp+34H]                     ; 00401AE2 _ D9. 44 24, 34
        fmul    st(0), st(0)                            ; 00401AE6 _ DC. C8
        fstp    dword ptr [esp+2CH]                     ; 00401AE8 _ D9. 5C 24, 2C
        mov     ecx, dword ptr [esp+2CH]                ; 00401AEC _ 8B. 4C 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401AF0 _ D9. 44 24, 2C
        fmul    st(0), st(2)                            ; 00401AF4 _ D8. CA
        sar     ecx, 1                                  ; 00401AF6 _ D1. F9
        sub     edx, ecx                                ; 00401AF8 _ 2B. D1
        mov     ecx, dword ptr [esp+34H]                ; 00401AFA _ 8B. 4C 24, 34
        fstp    dword ptr [esp+38H]                     ; 00401AFE _ D9. 5C 24, 38
        and     ecx, 80000000H                          ; 00401B02 _ 81. E1, 80000000
        fld     dword ptr [esp+38H]                     ; 00401B08 _ D9. 44 24, 38
        or      edx, ecx                                ; 00401B0C _ 0B. D1
        mov     dword ptr [esp+2CH], edx                ; 00401B0E _ 89. 54 24, 2C
        fld     dword ptr [esp+2CH]                     ; 00401B12 _ D9. 44 24, 2C
        lea     edx, [eax-2H]                           ; 00401B16 _ 8D. 50, FE
        cmp     edx, 100000000                          ; 00401B19 _ 81. FA, 05F5E100
        fld     st(0)                                   ; 00401B1F _ D9. C0
        fmulp   st(2), st(0)                            ; 00401B21 _ DE. CA
        fld     st(0)                                   ; 00401B23 _ D9. C0
        fmulp   st(2), st(0)                            ; 00401B25 _ DE. CA
        fld     st(2)                                   ; 00401B27 _ D9. C2
        fsubrp  st(2), st(0)                            ; 00401B29 _ DE. E2
        fmulp   st(1), st(0)                            ; 00401B2B _ DE. C9
        fstp    dword ptr [esp+3CH]                     ; 00401B2D _ D9. 5C 24, 3C
        fld     dword ptr [esp+3CH]                     ; 00401B31 _ D9. 44 24, 3C
        mov     dword ptr [esp+3CH], eax                ; 00401B35 _ 89. 44 24, 3C
        fadd    dword ptr [esp+30H]                     ; 00401B39 _ D8. 44 24, 30
        fstp    dword ptr [esp+30H]                     ; 00401B3D _ D9. 5C 24, 30
        jle     ?_0006                                  ; 00401B41 _ 0F 8E, FFFFFBF5

As you can see, your compiler has gone mental unrolling some of these loops, but not all of them.  The reason some of these loops are faster/slower than you think they should be is almost certainly down to CPU instruction cache getting battered by the unrolling.
Try compiling the code with loop-unrolling turned off.

Also, try replacing float(a) with (float)a, the compiler is losing its mind on that one and going off to a library.

Most of the fpu operations are going to memory in between instructions.  The reason for this is fpu consistency of trying to keep the results as 32bit floats instead of 80bit internal values.  Try setting the compiler to turn this feature off (in gcc it's -ffast-math or something).

Which compiler did you use?

Jim
Challenge Trophies Won:

Offline hellfire

  • Sponsor
  • Pentium
  • *******
  • Posts: 1289
  • Karma: 466
    • View Profile
    • my stuff
Re: Benchmarking looks suspiciously incorrect
« Reply #11 on: February 23, 2011 »
I guess this was a debug build as the compiler is even storing the counter back into memory for traceability.
So it's difficult to judge the quality (and sanity) of the generated code.

Quote
Im of the belief that compilers do not always do a good job. If you write poor c code, it will be translated into poor machine code. simple as that.
Usually a compiler does *exactly* what you tell him - see for example the type-casting muddle in the disassembly.

Generally it's not a good idea to completely avoid divisions or square-roots if you have dedicated circuits for the task (even if they're slow) - better try to use them in parallel to the rest of your code.
Since modern CPUs are completely multiscalar, it doesn't make sense to have arithmetical units running idle.

And they already put both of your functions into your CPU: SSE Reciprocal instructions
Challenge Trophies Won:

Offline Xetick

  • Atari ST
  • ***
  • Posts: 132
  • Karma: 80
    • View Profile
    • Plane9
Re: Benchmarking looks suspiciously incorrect
« Reply #12 on: February 23, 2011 »
For those that takes this as more than a "fun thing optimization".

More than likely so do you need this optimization for a specific scenario and then as hellfire points out is a lot better to use some SSE optimizations because then you do 4 ops at a time. In such a case your probablem is probably more with memory access then actual arithmetic. So you need to keep the caches filled. For example in a cloth simulation or water simulation your memory access will kill you quicker then the few ops needed to perform the actual simulation. But as always. Don't assume. Measure.

This also begs the question if the compiler had SSE enabled when you tested. Now days "all" cpus has SSE so it's pretty safe to assume its there.

Lastly how is the range of the optimization. I know that working using squared data is a lot faster but precision issues can bite you since your dealing with wide ranges.

Plane9 - Home of the Plane9 3d screensaver/music visualizer
Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #13 on: February 23, 2011 »
I found some more problems with benchmarking this code which I hadn't thought of before.

First, I'm running on a Core i7 720M.  This CPU normally runs at 1.7GHz, but when it's under load it can go up to 2.8GHz.

So I had the maddening thing of the empty loop running at 1.7, the CPU realising it needs to do something, cranking up to 2.8 and the last couple of loops returning negative timings - they ran faster than the empty loop!

Second, I rebuilt the code using visual studio, turned on optimize for size so no loop unrolling, and fixed the fpu settings.  The disassembly of that code looked fantastic - about as good as I could code by hand.  I also went to www.agner.org and grabbed Agner's code for using rdtsc timings.  I stuck that in instead of GetTickCount() and ran it again.  With 100million loops the timings were practically random.  That's to be expected as Windows is off doing other things and the tick count is global.  So I set it to 1, then 10.  Still no consistency.
Then I copied the InvDiv code to run after the empty loop and at the end.  I could not do anything to make those two loops show up the same timings.

So, for now, I'm beaten as to how to get an accurate consistent timing on this cpu for this code.

Jim
Challenge Trophies Won:

Offline rain_storm

  • Here comes the Rain
  • DBF Aficionado
  • ******
  • Posts: 3088
  • Karma: 182
  • Rain never hurt nobody
    • View Profile
    • org_100h
Re: Benchmarking looks suspiciously incorrect
« Reply #14 on: February 24, 2011 »
[unl=http://www.strchr.com/performance_measurements_with_rdtsc]strchr.com[/url] says that you should not average you're result over 1000's of iterations. The reason is the likeliness that a context switch will occur. It links to agners page and true to form agners code repeats one instruction 100 times (not looped just 100 copies of "shr eax, 5" ordered sequentially.

Also strchr states that to truely test some piece of code you should implement the benchmarking in a real application so that its processing real world data and has to overcome things such as cache misses and context switches.

Looks like there's a whole lot more to getting accurate timings then just using RTDSC. I'm going to study Agners code its got a lot of people linking to it as a good example.

Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #15 on: February 24, 2011 »
I didn't know that Intel had changed rdtsc on recent cpus to tick at a constant rate instead of at the cpu frequency, and hence it's no longer measuring cpu ticks (at whatever instantaneous cpu frequency) but wall clock time.  I can see why they did it, but it doesn't help profiling and it explains why I could still not get good results.

I suspect that too much software assumes rdtsc works the wall clock way when it never has and even though Intel had only ever stated that it was monotonically increasing (always goes up, no specific rate), and so they had to change it.

In my tests above I have also used SetProcessorAffinityMask to make sure I was always running my test on the same core (2).  I'm also plugged in and power management is disabled, but that has no effect on the clock-changing abilities of turbo boost cpus.

Might have to look into the other performance counter registers.

Jim
Challenge Trophies Won:

Offline Xetick

  • Atari ST
  • ***
  • Posts: 132
  • Karma: 80
    • View Profile
    • Plane9
Re: Benchmarking looks suspiciously incorrect
« Reply #16 on: February 24, 2011 »
Benchmarking is a tricky beast when it comes to these low level optimizations.
Another piece to the pie is that if your running under windows you should use QueryPerformanceCounter and not the RDTSC instruction directly.

Some code
Code: [Select]
// Init
LARGE_INTEGER qwTicksPerSec;
bool usingQPF = QueryPerformanceFrequency( &qwTicksPerSec )

// Get a time
LARGE_INTEGER time;
QueryPerformanceCounter( &time );
double timeInSec= double timeInMs = (double)time.QuadPart/(double)qwTicksPerSec.QuadPart;
double timeInMs = (double)time.QuadPart/(double)(qwTicksPerSec.QuadPart/1000);

Not sure if it makes any difference in this case though.
Plane9 - Home of the Plane9 3d screensaver/music visualizer
Challenge Trophies Won:

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: Benchmarking looks suspiciously incorrect
« Reply #17 on: February 25, 2011 »
Yeah, the problem is still that if your cpu changes clock rate, QPC and RDTSC are still reading wall clock time and not cpu cycles or some other time related to cpu frequency.

I have found a way to disable Turbo Boost.  Go into advanced power management options and set the maximum processor state to 99%.  That forces my cpu to stay at 1.73GHz.  That makes the timings a lot saner.

Also I found another reason Intel changed RDTSC to do wall clock timing - it enables very, very fast access to the time of day for database servers, without doing any IO to get some other timer.

Jim
Challenge Trophies Won: