math KO!
Sass Attila
macavezo at axelero.hu
Thu Oct 28 12:38:23 CEST 2004
Sziasztok!
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)
Például
Celeron (Coppermine) 600 Mhz (linux alatt) :
#include <math.h>
#define exponent 512.0
int main(void)
{
double d,k;
int i;
d = pow(2.0,exponent);
for (i=0;i<100000000;i++)
k = d * d;
}
22.22 s egyik és 2.7s a másik esetben (itt a végeredmény esik bele ebbe
a kategóriába, nem lassabb akkor sem, ha már a kiindulási szám is
beleesik)
Vagyis egymilliárd szorzás idejei: 222.2s és 27s.
Pentium 4 1.7Ghz Windows XP, dotnet fejlesztőeszköz alatt (ezen a gépen
megnéztem linux/gcc alatt is, teljesen hasonló volt az eredmény):
private void button1_Click(object sender, System.EventArgs e)
{
double exponent =512.0;
double d,k;
d = Math.Pow(2,exponent);
int t = Environment.TickCount;
for (int i = 0;i<1000000000;i++)
k= d*d;
MessageBox.Show((Environment.TickCount
-t).ToString());
}
2.4s az egyik esetben és 100*7s = 700s másik esetben (ez utóbbinál csak
10000000-ig futtattam a ciklust, ezért a 100*7s)
Vagyis egymilliárd szorzás idejei: 2,4s és 700s.
Egy 1.1G-s celeronon is megcsináltam, az is hasonló volt a 600-ashoz,
csak gyorsabb volt annál (de ott is kb. 10-es szorzó volt, ha jól
emlékszem)
Vagyis az 1.7-es P4 sokkal lassabb a 600-es celeronnál ebben a kritikus
tartományban.
Összeadásnál hasonló a helyzet, csak ott nyilván az exponent 1024 körül
kell legyen.
A kérdésem: Mitől lehet ez?
A lebegőpontos szorzásnál a mantisszákat szorozni, a karakterisztikákat
összeadni kell. Ilyen nehéz összeadni két számot? A mantisszák szorzása
pillanatok alatt megvan (más mantisszákkal is csináltam a tesztet,
azoktól teljesen független a sebesség).
Csak valami olyant tudok elképzelni, hogy valami böszme sok bites
integerekké alakítja mindig a számokat, és azokkal számol belül...
Az is érdekes, hogy a P4-nél ilyen hatalmas a teljesítményesés (közel
300-szorosára nő a végrehajtási idő)
Tudjátok ennek az okát?
Nagyon kiváncsi lennék, hogy AMD processzorokon van-e ilyen
teljesítménybeli törés, és hol?... És nem x86 procikon?
--
sassi
More information about the Elektro
mailing list