JavaScript og SIMD: Hvordan de sammen kunne bringe en ny klasse af apps til browseren

Googles formand Eric Schmidt erklærede engang næsten alle applikationer ville blive bygget ved hjælp af HTML5 - og nu ser det ud til, at webbrowseren er ved at tage et skridt nærmere det ideal.

Historisk har browseren kæmpet for at overskride sin ydmyge oprindelse, der serverer dokumenter og gøre det skridt til at håndtere den avancerede grafikbehandling, der bruges i opgaver såsom spil, fotoredigeringssuiter og computersyn.

Nu arbejder der på at bringe disse sofistikerede grafik- og signalbehandlingsfunktioner til JavaScript, det de facto scriptingsprog til browseren.

Indsatsen er fokuseret på at introducere support til SIMD-operationer med enkelt instruktion, flere data til JavaScript.

SIMD-operationer tillader, at den samme instruktion udføres på flere data samtidig, hvilket er hurtigere end at anvende den samme instruktion på hvert stykke data individuelt.

Den slags parallelisme er især nyttig, når man manipulerer billeder - for eksempel når man justerer kontrasten til et billede, har flere pixels i billedet brug for den samme handling, der anvendes på dem.

Hvordan SIMD udfører instruktioner mod data parallelt. Billede: Intel

Selvom programmeringssprog som C ++ kan kompileres for at drage fordel af SIMD-kompatible instruktionssæt i processorer, giver JavaScript-motorer i populære browsere ikke native support til SIMD-behandling.

Imidlertid ser denne support ud til at blive ledet til browseren. JavaScript er baseret på en officiel specifikation kendt som ECMAscript, et sprog, der er ratificeret af Ecma International. Det tekniske udvalg for Ecma International har støttet et forslag om at inkludere et indbygget SIMD API i en fremtidig version af ECMAscript, muligvis version 7, baner vejen for dens støtte i de store browsere.

Den foreslåede SIMD API til JavaScript blev sammensat af Intel, Google og Mozilla, og det er vist, at det leverer størrelsesordrer hurtigere ydeevne, når du udfører visse opgaver.

For eksempel blev et Mandelbrot-sæt genereret ved hjælp af SIMD API i Firefox Nightly, en eksperimentel opbygning af browseren, gengivet med tre gange den billedhastighed, der blev opnået, når man ikke bruger SIMD. Den hastighedsforøgelse, som SIMD API muliggør i JavaScript-kode, er omtrent den samme som den hastighed, som SIMD tillader i C ++, ifølge Intel-benchmarks.

Speed-up, når du gengiver et Mandelbrot-sæt ved hjælp af SIMD. Billede: Intel Benchmarks, der viser fremskyndelsen, når du bruger SIMD. Billede: Intel

En bred vifte af spillemotorer såvel som billed- og lydbehandlings- og kryptografiske softwarebiblioteker, der er i stand til at understøtte sofistikerede applikationer, kunne køre acceptabelt i browseren, når SIMD-support bliver en realitet, sagde Intel, seniorchefsingeniør Moh Haghighat.

"Vores forventning er, at det vil have en enorm indflydelse på webdomænet og bringe alle disse klasser af anvendelse ind på webplatformen, " sagde han.

"Vi ser frem til biblioteker, der virkelig er nyttige inden for domæner som spil, billedbehandling, signalbehandling, videobehandling og hvad Intel kalder perceptuel computing, såsom computersyn blandt andre. De er typisk computerkrævende. De arbejder på store matriser af data, og SIMD-kapacitet vil hjælpe disse applikationer. "

Disse apps og softwarebiblioteker behøver ikke at blive skrevet fra bunden af ​​JavaScript, takket være Emscripten-kompilatorens evne til portprogrammer, der er bygget med C ++, til at køre i browseren.

Emscripten er i stand til at tage LLVM-bytekode genereret ved at komponere C ++ og sende den ud som JavaScript. Det er i stand til at generere en optimeret form for JavaScript kendt som ASM.js.

ASM.js er en delmængde af JavaScript, der undgår adskillige dynamiske funktioner på sproget og dermed gør det muligt for JavaScript-motorer i browseren at foretage ydeevneoptimeringer, som JavaScript's dynamiske karakter ville gøre umulig. ASM.js er blevet demonstreret, der kører en række benchmarks i Firefox kun 1, 5 gange langsommere end native code.

Emscripten understøtter allerede SIMD API og genererer SIMD.js-kode fra C ++ -kode, der udnytter SIMD-instruktionssættet.

Haghighat sagde, at Emscripten var blevet brugt til at port spilmotorer med "en million kodelinjer" til browseren, hvor Unreal 3 allerede var portet og Unreal 4 i færd med at blive konverteret.

Ifølge Mozilla-forskningsingeniør Dan Gohman er det ikke kun et spørgsmål om at overføre en applikation til JavaScript.

"Det, vi har fundet, er, at det er temmelig let at få den oprindelige version med C ++, for at få den allerførste ting, der kører, men hvad udviklerne typisk vil gøre, er at optimere oplevelsen, " sagde han.

Én optimering er at forklare de store mængder data, der skal downloades, før nogle applikationer kan køre. Gohman giver eksemplet på et browserspil ved hjælp af Unity-motoren, der indlæser hundrede megabyte teksturer. For at løse dette problem vælger nogle udviklere at streame aktiver undervejs og indlæse kun så meget som nødvendigt for nogen at begynde at spille.

SIMD JavaScript API kan testes ved hjælp af Firefox Nightly og en brugerdefineret version af Chromium browser produceret af Intel.

Selvom SIMD-support sandsynligvis implementeres i de store browsere, kan det tage lidt tid. ECMAscript 6-specifikationen skal afsluttes senere på året, selvom nogle funktioner allerede understøttes af JavaScript-motorer i større browsere. SIMD API'en er dog målrettet mod inkludering i en senere ECMAscript-specifikation, muligvis version 7.

SIMD API

Den foreslåede API introducerer tre nye datatyper, der hver repræsenterer en vektor med flere numre. Der er float32x4, der kan gemme fire 32-bit flydepunktsværdier med en enkelt præcision, int32x4, der indeholder fire 32-bit signerede heltalværdier, og float64x2, der indeholder to 64-bit flydende værdier. Det opretter også nye arrays for hver af disse nye datatyper.

For at oprette en forekomst af disse datatyper kalder udvikleren konstruktøren og videregiver det til argumenterne for at indstille hver af værdierne.

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

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

Udvikleren kan derefter udføre en række matematiske funktioner på disse nye datatyper ved at kalde den ønskede metode. Her tilføjes variablerne a og b, defineret ovenfor som vektorer, der hver har fire flydepunktværdier, sammen.

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

Udvalget af funktioner, der kan udføres på disse vektorer, inkluderer: abs, neg, tilføj, sub, mul, div, klemme, min, max, gensidig, gensidig kvantitet, skala, sqrt, shuffle, lessThan, lessThanOrEqual, lige, notEqual, GreaterThanOrEqual, GreaterThan.

Arbejdet med SIMD API-specifikationen er i gang og endnu ikke afsluttet.

© Copyright 2021 | pepebotifarra.com