Imam je, pisao sam je svojerucno, ali ti je na zalost ne mogu dati point blank,
jer je vezana autorskim pravima za jednu manju, vrlo poznatu i vrlo nezgodnu firmu.
Otkricu ti jedan vrlo bitan detalj koji ti moze ustedeti dosta vremena:
Ako uradis C model 16-bitne aritmetike primenjene za izracunavanja tih formula,
videces da medjurezultati iskacu (vrlo neuredno i nepredvidljivo, ali se desava) iz
okvira 1.15f preciznosti. Tacnije, medjuvrednosti sabiranja i mnozenja mogu da budu i veci od +/- 1.0.
Zbog toga, da bi sve isterao kako treba, morao bi da formule razbijes na delove
koji nikad nece generisati prevelike vrednosti i one druge. Ove prve delove formula
moras uraditi u nekoj malo grubljoj rezoluciji (naprimer 3.13f). Rezultate svih ostalih
delova treba takodje da dovedes na tu istu odabranu rezoluciju, pa tek kad sve
zavrsis da vratis na 1.15f. To je jedini nacin da dobijes sta treba.
Takodje, algoritam je register-intensive, tako da ces morati da neki od general-purpose registara (ecx, edx, eax, ebx) da push/pop-ujes jednom po prolasku kroz
petlju.
Odgovori na ostala pitanja:
Moji najbolji rezultati sa MMX-om (naravno, sve zavisi od algoritma) su 300% (tj. 3x), mada verujem da za neke vrlo proste algoritme (tipa prosta sabiranja/oduzimanja/mnozenja) mogu i brze. Presudan preduslov je da buffer bude alociran na 8x boundary-ju, u protivnom, nema mnogo koristi od cele price.
MMX radi i na AMD-u bez problema.
Izvrstan tutorijal za MMX postoji (mmx_cbt.exe) i to online (sa animacijom) vrlo zgodan, ali ipak treba i knjizica za neke jako bitne detalje.
Medjutim, na kraju price, Intel je toliko dobro uradio run-time optimizaciju
da i kod napisan levom nogom ispadne isto toliko brz kao i kod koji je strpljivo uparivan (U/V pipeline).
Evo linka za tutorijal:
http://www.intel.com/software/products/college/ia32/mmxdown.htm