Kokia viena kodo eilutė sukrėtė programavimo pasaulį?
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
Ši eilutė pasirodė id Software kompanijos Quake 3 Arena (1999) pradiniame kode ir yra funkcijos šio žaidimo grafinėje komponentėje dalimi. Ji skirta slankaus kablelio kintamojo atvirkštinės šaknies (
) apytiksliam paskaičiavimui. Ši funkcija ypač svarbi, nes ji naudojama atstumui tarp vektorių paskaičiavimui. Žaidimuose
jos prireikia milijonus kartų per sekundę tad sparta ypač svarbi. Anksčiau tam skirtos funkcijos pirmiausia apskaičiuodavo rezultato įvertį naudodamos paieška lentelėje (lookup), o tada jį patikslindavo panaudodamos Niutono aproksimacijos algoritmą. Naujoji funkcija, pavadinta greitąja atvirkštine kvadratine šaknimi, pasinaudojo IEEE 754 slankiojo kablelio formatu, kad pirmąjį įvertį apskaičiuotų daug greičiau ir sunaudodama daug mažiau atminties nei naudojant lentelę. Tai buvo daroma paimant 32 bitų slankiojo kablelio bitus kaip sveikąjį skaičių, pastumiant tą skaičių per vieną bitą į dešinę, o tada atimant rezultatą iš magiškosios konstantos. Tada gauti bitai vėl traktuojami kaip slankiojo kablelio skaičiaus ir tik tada patikslinami minėtu aproksimacijos metodu.
O magiškas skaičius atsirado dėl slankaus skaičiaus su laipsniu (tokio, kaip 5.6*109) saugojimo IEEE 754 formatu ypatybių, kai laipsnis (eksponentė) buvo saugomas atskiruose bituose (dabar nesigilinsime į subtilybes).
Ir įdomiausia, kad ši nepaprastai greitas sprendimas žemos rezoliucijos grafikai bent 5 m. tyliai sau kiurksojo Quake kode, nors jo ištakos atrandamos daugiau nei prieš dešimtmetį. Jei tai būtų atlikta akademiniuose sluoksniuose, vien šios eilutės būtų pakakę disertacijai.O jos istorija tokia.
Kanadietis William Kahanas1) ir K.C. Ngas iš Kalifornijos un-to Berklyje 1986 m. parašė straipsnį (likusį nepublikuotu) apie kvadratinės šaknies reikšmės paskaičiavimą panaudojant manipuliavimus bitais ir panaudojant Niutono aproksimaciją. Po poros metų apie tą techniką sužinojo Cleve Moleris2) iš Ardent Computer ir ja pasidalijo su bendradarbiu Greg Walshu3), kuris ir išvystė tą garsųjį atvirkštinės kvadratinės reikšmės paskaičiavimo algoritmą. Gary Tarolli4) tuo metu konsultavo Kubota finansuojančią Ardent Computer, ir tikriausiai jis apie 1994 m. algoritmą atnešė į 3dfx Interactive. Jim Blinnas5) jį pristatė IEEE Computer Graphics and Applications 1997 m. liepos-rugpjūčio numeryje. Kodo analizė išsiaiškino, kad algoritmo variantas buvo naudojamas ir Activision kompanijos žaidime Interstate'76. Į id Software algoritmą greičiausiai atnešė Brian Hookas. Kodas plačiai pasklido 2002-2003 m. Buvo ginčijamasi, kas parašė algoritmą ir kaip išvesta magiškoji konstantą tol, kol 2006 m. klausimą išsprendė pats algoritmo autorius Greg Walshas. 2007 m. algoritmas panaudotas kai kurių aparatinių plokščių šešėliavimuose.Ištobulėjus aparatinei įrangai, ypač x86 procesorių SSE instrukcijai rsqrtss (įtrauktai 1999-ais ir spartesnei daugiau nei 5 kartus). šis algoritmas jau nebėra geriausias pasirinkimas, tačiau išlieka įdomiu istoriniu momentu.
1) Viljamas Kechanas (William "Velvel" Morton Kahan, g. 1933 m.) - žydų kilmės kanadiečių matematikas ir kompiuterininkas, Kalifornijos un-to Berklyje profesorius. Gavo Tiuringo premiją (1989) už indėlį į skaitmeninę analizę. Sukūrė (pavadintą jo vardu) skaičių IEEE 754 pavaizdavimu sudėties algoritmą minimizuojant klaidą. 9-me dešimtm. sukūrė programą paranoia, tikrinančią platų ratą galimų klaidų operacijose su slankiais skaičiais. Rengia naują slankaus skaičiaus pavaizdavimo standartą (IEEE 754-2008).
2) Klivas Mouleris (Cleve Barry Moler, g. 1939 m.) - amerikiečių matematikas ir programuotojas, specializuojantis skaitmeninėje analizėje. 8-ojo dešimtm. antroje pusėje sukūrė FORTRAN bibliotekas LINPACK ir EISPACK. Taip pat sukūrė MATLAB paketą ir 1984 m. jo komercializavimui kartu su Jack Little įsteigė MathWorks. Iki 1989 m. dar dirbo ir Intel Hypercube, kur įvedė terminą nepatogiai lygiagretus (embarrassingly parallel). Parašė 4 vadovėlius apie skaitmeninę analizę.
3) Gregas Velšas (Greg Walsh) - amerikiečių kompiuterininkas, pradėjęs dirbti su Internetu ir paskirstytais skaičiavimais, kad dar net nebuvo Interneto ir padėjęs kurti pirmąjį WYSIWYG redaktorių Xerox PARC. Vėliau padėjo įsteigti Ardent Computer kompaniją. Jos Titan grafinis kompiuteris turėjo problemų su greitaveika ir G. Velšas sukūrė greitą 1/sqrt(x) funkciją, kad programinė įranga galėtų sparčiai veikti kompiuteriuose, tam neturinčiuose aparatinio palaikymo. Tam idėją gavo iš K. Moulerio, tuo metu dirbusio Ardent. K. Mouleris tuo metu nagrinėjo N-R iteraciją aproksimacijai, tad G. Velšas taip pat, naudodamas panašius (tik sudėtingesnius) metodus, parašė ir 1/cuberoot(x).
4) Garis Tarolis (Gary Tarolli) - amerikiečių kompiuterininkas, išradėjas, 1994 m. įsteigęs 3Dfx Interactive ir joje dirbęs iki 2000-ųjų. Vėliau iki 2016 m. dirbo NVidia kaip 3D architektas, kūręs GPU. Turi kelis patentus.
5) Džeimsas Blinas (James F. Blinn, g. 1949 m.) - amerikiečių kompiuterininkas, išgarsėjęs kaip grafikos ekspertas NASA JPL laboratorijoje (iki 1995 m.), ypač animacijose Voyager projekte, K. Sagano dokumentiniame cikle Kosmosas (1980) ir BlinnPhongo šešėliavimo modelio tyrinėjimais. Po NASA prisijungė prie Microsoft Research, į pensiją išėjęs 2009 m. 1987-2007 m. vedė Džimo Blino kampelis rubriką IEEE Computer Graphics & Applications. Jam priskiriamas Jam Blino dėsnis, teigiantis, kad atvaizdavimo laikas išlieka pastovus, net ir spartėjant kompiuteriams animatoriai linkę gerinti kokybę, vaizduoti sudėtingesnes scenas sudėtingesniais algoritmais...
Papildomai skaitykite:
Kaip suliesėti?
Vykdyti ir laukti
Unix komandinės eilutė
Mašininės grafikos pradžia
C/C++: Ką reiškia "static"?
Programuotojus į savartyną!
Pirmasis Java įskiepis Lietuvoje
C++: mutable - nauja kalbos savybė
Intuityvus Hafmano kodo paaiškinimas
Sunkus Linux posūkis nuo C link Rust
S. Krėjus: kūręs galingiausius kompiuterius!
Suleidote arklius užverkite ir tvarto duris!
Rašybos tikrinimo programa RAŠTAS
Įvadas į Perl kalbą: Kas naudoja Perl?
Lambda išraiškos Java į naują lygį
Džonas Bakas FORTRAN tėvas
Į Mėnulį skridę kompiuteriai
Tcl kalba - iš susierzinimo
Skriptai - ateities kalbos?
Kobolo motina
Vartiklis