math KO!

Palasik Sandor palasik at mail.datanet.hu
Fri Oct 29 10:53:15 CEST 2004


> Tapasztalataim szerint igen nagy teljesítménybeli különbség tud lenni
> akkor, ha a matematikai processzor olyan számmal dolgozik, melynek
> lebegőpontos ábrázolásában: a*2^b ,  b>=1024 vagy b<-1022. A jelenség
> akkor áll fenn, ha a kiindulási vagy a végeredmény beleesik ebbe a
> tartományba.
> A jelenség op-rendszer és fordító független. (ugyanozon a gépen
> winXP/dotnet és lin/gcc alatt is egyformán lassabb)

Csináltam én is tesztet. Ugyanúgy egy 2^X számot szoroztam önmagával. Az
volt az érzésem, hogy valahol az eredmény exponense körül lehet valami
trükk, ha az túl nagy vagy túl kicsi. Ezért csináltam két verziót: a POP
kezdetű soroknál nem tárolom az eredményt, a STORE kezdetűeknél igen.

A POP kódja:
  00121 dd 45 a0         fld     QWORD PTR _d$42616[ebp]
  00124 dc 4d a0         fmul    QWORD PTR _d$42616[ebp]
  00127 dd c0            ffree   ST(0)
  00129 d9 f7            fincstp


A STORE kódja:
  000fa dd 45 a0         fld     QWORD PTR _d$42616[ebp]
  000fd dc 4d a0         fmul    QWORD PTR _d$42616[ebp]
  00100 dd 5d b8         fstp    QWORD PTR _k$[ebp]

A következőket mértem:

Athlon XP 2200+:
pop   -1025: 2.39e+004 mul/sec
pop   -1024: 2.28e+004 mul/sec
pop   -1023: 2.26e+004 mul/sec
pop    -513: 3.99e+005 mul/sec
pop    -512: 3.95e+005 mul/sec
pop    -511: 4.24e+005 mul/sec
pop    -257: 4.09e+005 mul/sec
pop    -256: 3.86e+005 mul/sec
pop    -255: 4.29e+005 mul/sec
pop     255: 4.04e+005 mul/sec
pop     256: 4.04e+005 mul/sec
pop     257: 4.04e+005 mul/sec
pop     511: 4.04e+005 mul/sec
pop     512: 3.9e+005 mul/sec
pop     513: 3.99e+005 mul/sec
pop    1023: 4.09e+005 mul/sec
pop    1024: 3.95e+005 mul/sec
pop    1025: 4.19e+005 mul/sec
store -1025: 1.63e+004 mul/sec
store -1024: 1.55e+004 mul/sec
store -1023: 1.56e+004 mul/sec
store  -513: 1.58e+004 mul/sec
store  -512: 1.51e+004 mul/sec
store  -511: 8.18e+005 mul/sec
store  -257: 8e+005 mul/sec
store  -256: 8.48e+005 mul/sec
store  -255: 8.48e+005 mul/sec
store   255: 8.59e+005 mul/sec
store   256: 8.18e+005 mul/sec
store   257: 8.18e+005 mul/sec
store   511: 8.59e+005 mul/sec
store   512: 8.49e+005 mul/sec
store   513: 8.59e+005 mul/sec
store  1023: 8.48e+005 mul/sec
store  1024: 8.38e+005 mul/sec
store  1025: 8.48e+005 mul/sec

C4 2400:
pop   -1025: 1.51e+003 mul/sec
pop   -1024: 1.49e+003 mul/sec
pop   -1023: 1.51e+003 mul/sec
pop    -513: 5.68e+005 mul/sec
pop    -512: 5.73e+005 mul/sec
pop    -511: 5.68e+005 mul/sec
pop    -257: 5.73e+005 mul/sec
pop    -256: 5.68e+005 mul/sec
pop    -255: 5.73e+005 mul/sec
pop     255: 5.68e+005 mul/sec
pop     256: 5.73e+005 mul/sec
pop     257: 5.68e+005 mul/sec
pop     511: 5.73e+005 mul/sec
pop     512: 5.68e+005 mul/sec
pop     513: 5.73e+005 mul/sec
pop    1023: 5.68e+005 mul/sec
pop    1024: 2.83e+003 mul/sec
pop    1025: 2.83e+003 mul/sec
store -1025: 3.44e+003 mul/sec
store -1024: 3.44e+003 mul/sec
store -1023: 3.44e+003 mul/sec
store  -513: 3.4e+003 mul/sec
store  -512: 3.4e+003 mul/sec
store  -511: 6.87e+005 mul/sec
store  -257: 6.87e+005 mul/sec
store  -256: 6.87e+005 mul/sec
store  -255: 6.87e+005 mul/sec
store   255: 6.87e+005 mul/sec
store   256: 6.87e+005 mul/sec
store   257: 6.87e+005 mul/sec
store   511: 6.87e+005 mul/sec
store   512: 3.36e+003 mul/sec
store   513: 3.36e+003 mul/sec
store  1023: 3.36e+003 mul/sec
store  1024: 6.87e+005 mul/sec
store  1025: 6.87e+005 mul/sec

Nekem úgy tűnik, mintha az eredmények normalizálásával lenne gond. Ha túl
nagy, vagy túl kicsi, akkor tovább tart neki double-ba konvertálni. Ha
tippelnem kéne, valami limitek vannak a math processzorban, amiken belül
izomból csinálja a műveleteket, de ha azokon kívül esik, akkor valami
mikroprogram, esetleg operációs rendszerbeli exception keletkezik és az
lassítja.

Palasik Sándor




More information about the Elektro mailing list