JavaScript og SIMD: Hvordan de sammen kunne bringe en ny klasse apper til nettleseren

Googles styreleder Eric Schmidt proklamerte en gang at nesten alle applikasjoner ville bli bygget ved hjelp av HTML5 - og nå ser det ut til at nettleseren er i ferd med å ta et skritt nærmere det idealet.

Historisk har nettleseren slitt med å overskride sin ydmyke opprinnelse som serverer dokumenter og gjøre et grep for å håndtere den avanserte grafikkbehandlingen som brukes i oppgaver som spill, fotoredigeringssuiter og datasyn.

Nå jobbes det med å bringe disse sofistikerte grafikk- og signalbehandlingsfunksjonene til JavaScript, de facto skriptspråk for nettleseren.

Innsatsen er fokusert på å introdusere støtte for SIMD-operasjoner med enkel instruksjon, flere data (JavaScript).

SIMD-operasjoner gjør at den samme instruksjonen kan utføres på flere data samtidig, noe som er raskere enn å bruke den samme instruksjonen på hvert stykke data hver for seg.

Den slags paralleller er spesielt nyttig når du skal manipulere bilder - for eksempel når du justerer kontrasten til et bilde, trenger flere piksler i bildet den samme operasjonen som brukes for dem.

Hvordan SIMD utfører instruksjoner mot data parallelt. Bilde: Intel

Selv om programmeringsspråk som C ++ kan kompileres for å dra nytte av SIMD-kompatible instruksjonssett i prosessorer, gir JavaScript-motorer i populære nettlesere ikke støtte for SIMD-behandling.

Imidlertid ser det ut til at støtten ledes til nettleseren. JavaScript er basert på en offisiell spesifikasjon kjent som ECMAscript, et språk som er ratifisert av Ecma International. Den tekniske komiteen til Ecma International har støttet et forslag om å inkludere et eget SIMD API i en fremtidig versjon av ECMAscript, muligens versjon 7, og baner vei for sin støtte i de store nettleserne.

Det foreslåtte SIMD API for JavaScript ble satt sammen av Intel, Google og Mozilla, og har vist seg å levere bestillinger med større styrke raskere når du utfører visse oppgaver.

For eksempel ble et Mandelbrot-sett generert ved hjelp av SIMD API i Firefox Nightly, en eksperimentell bygging av nettleseren, gjengitt med tre ganger bildefrekvensen oppnådd når du ikke bruker SIMD. Hastighetsøkningen SIMD API aktiverer i JavaScript-koden er omtrent den samme som speed-up som SIMD tillater i C ++, i følge Intel benchmarks.

Speed-up når du gjengir et Mandelbrot-sett med SIMD. Bilde: Intel Benchmarks som viser speed-up når du bruker SIMD. Bilde: Intel

Et bredt spekter av spillmotorer, så vel som bildebehandlings- og lydbehandlings- og kryptografiske programvarebiblioteker som kan støtte sofistikerte applikasjoner, kan kjøres akseptabelt i nettleseren når SIMD-støtte blir en realitet, sa Intel-sjefsingeniør Moh Haghighat.

"Vår forventning er at det kommer til å ha stor innvirkning på webdomenet og bringe alle disse programklasser inn på nettplattformen, " sa han.

"Vi ser frem til biblioteker som virkelig er nyttige i områder som spill, bildebehandling, signalbehandling, videobehandling og det Intel kaller perseptuell databehandling, for eksempel datamaskinvisjon blant andre. De er typisk databehandlingskrevende. De opererer på store matriser med data, og SIMD-funksjonalitet vil hjelpe disse applikasjonene. "

Disse appene og programvarebibliotekene trenger ikke skrives fra grunnen av i JavaScript, takket være muligheten til Emscripten-kompilatoren til portprogrammer som er bygd med C ++ til å kjøre i nettleseren.

Emscripten kan ta LLVM-bytekode generert ved å kompilere C ++ og sende den ut som JavaScript. Den er i stand til å generere en optimalisert form for JavaScript kjent som ASM.js.

ASM.js er en delmengde av JavaScript som undgår flere dynamiske funksjoner på språket, og gjør det mulig for JavaScript-motorer i nettleseren å gjøre ytelsesoptimaliseringer som JavaScripts dynamiske natur vil gjøre umulig. ASM.js har blitt demonstrert som kjører en rekke standarder i Firefox bare 1, 5 ganger saktere enn innfødt kode.

Emscripten støtter allerede SIMD API, og genererer SIMD.js-kode fra C ++ -kode som utnytter SIMD-instruksjonssettet.

Haghighat sa at Emscripten hadde blitt brukt til å portere spillmotorer med "en million linjer med kode" til nettleseren, med Unreal 3 allerede portet og Unreal 4 i ferd med å bli konvertert.

I følge Mozilla-forskningsingeniør Dan Gohman er det ikke bare et spørsmål om å portere en applikasjon til JavaScript.

"Det vi har funnet er at det er ganske enkelt å få den første versjonen med C ++, for å få det aller første som kjører, men det utviklerne vanligvis vil gjøre er å optimalisere opplevelsen, " sa han.

En optimalisering er å skjule de store datamengdene som må lastes ned før noen applikasjoner kan kjøre. Gohman gir eksempelet på et nettleserspill som bruker Unity-motoren som laster inn hundrevis av megabyte teksturer. For å løse dette problemet velger noen utviklere å streame inn eiendeler mens du laster inn bare så mye som er nødvendig for at noen skal begynne å spille.

SIMD JavaScript API kan testes ved hjelp av Firefox Nightly og en tilpasset versjon av Chromium-nettleseren produsert av Intel.

Selv om SIMD-støtte trolig blir implementert i de store nettleserne, kan det ta litt tid. ECMAscript 6-spesifikasjonen skal fullføres senere i år, selv om noen funksjoner allerede er støttet av JavaScript-motorer i store nettlesere. SIMD API er imidlertid målrettet for inkludering i en senere ECMAscript-spesifikasjon, muligens versjon 7.

SIMD API

Det foreslåtte API introduserer tre nye datatyper, som hver representerer en vektor som har flere tall. Det er float32x4, som kan lagre fire 32-biters enkeltpresisjons flytende punktverdier, int32x4, som inneholder fire 32-biters signerte heltallverdier, og float64x2, som inneholder to 64-biters flytende punktverdier. Det oppretter også nye matriser for hver av disse nye datatypene.

For å opprette en forekomst av disse datatypene, kaller utvikleren konstruktøren og gir dem argumentene for å angi hver av verdiene.

var a = SIMD.float32x4 (1.0, 2.0, 3.0, 4.0);

var b = SIMD.float32x4 (5, 0, 6, 0, 7, 0, 8, 0);

Utvikleren kan deretter utføre en rekke matematiske funksjoner på disse nye datatypene ved å kalle ønsket metode. Her blir variablene a og b, definert over som vektorer som hver har fire flytende punktverdier, lagt sammen.

var c = SIMD.float32x4.add (a, b);

Utvalget av funksjoner som kan utføres på disse vektorene inkluderer: abs, neg, add, sub, mul, div, clamp, min, max, reciprocal, reciprocalqqq, skala, sqrt, shuffle, lessThan, lessThanOrEqual, like, notEqual, GreaterThanOrEqual, GreaterThan.

Arbeidet med SIMD API-spesifikasjonen pågår og er ennå ikke ferdigstilt.

© Copyright 2020 | mobilegn.com