2011-09-29 7 views
6

Sto lavorando a un'applicazione Silverlight nel browser con alcune operazioni di calcolo piuttosto intenso, ad esempio, esecuzione di una trasformazione del coseno discreta inversa o una trasformazione di Fourier veloce, centinaia di volte al secondo. Sarebbe utile poter scaricare quanto più possibile sulla GPU del computer. So che c'era lo some discussion di questo con Silverlight 3 e 4, usando pixel shader, ma il consenso era che, poiché Silverlight 3/4 non utilizzava l'accelerazione hardware per i loro pixel shader, e perché il loro linguaggio shader pixel era limitato al Livello 2 , non avrebbe prodotto un aumento delle prestazioni, se non del caso.Utilizzo della GPU su Silverlight 5 per la matematica generica

Tuttavia, si presume che Silverlight 5 abbia una gamma molto più ampia di grafica con accelerazione hardware, inclusa una pipeline 3D ragionevolmente completa. Tuttavia, non ho ancora sentito se qualcuno è stato in grado di sfruttare questa pipeline per accelerare le operazioni matematiche generiche (come FFT, DCT, IDCT, ecc.). Qualcuno l'ha già provato? Qualche indicazione su dove iniziare a cercare?

risposta

5

Ho pensato di postare ciò che ho scoperto finora. La risposta breve è che no, non penso che la pipeline 3D su Silverlight 5 possa essere sfruttata per questo genere di cose. Da un lato, da quello che posso dire, i pixel shader e i vertex shader che fanno parte della pipeline, infatti, vengono eseguiti sulla GPU (a differenza degli shader 2D in Silverlight 4, che sono stati eseguiti sulla CPU) .

Ma che ha detto:

(1) Tutto quello che ho letto dice che ottenere i dati sulla GPU è molto veloce, ma che per la maggior parte delle macchine, ottenendo che i dati su GPU è molto più lento, sulla ordine di millisecondi. Ciò rende improbabile che possiamo, ad esempio, caricare la GPU con i dati necessari per eseguire un FFT, eseguire la FFT e quindi recuperare i dati più velocemente di quanto potremmo fare semplicemente sulla CPU.

(2) Silverlight 5 ha un set di istruzioni molto limitato che può essere eseguito sulla GPU. Nello specifico, è limitato a HLSL Level 2, che ha un numero limitato di istruzioni e registri disponibili. Dubito che sarebbe possibile - nella migliore delle ipotesi, sarebbe molto difficile e molto lento - modellare un FFT o un DCT all'interno di quelle istruzioni limitate.

(3) Ma anche se potessimo aggirare queste due limitazioni, da quello che posso dire, Silverlight non ha alcuna capacità di leggere i risultati dei calcoli eseguiti dalla GPU. Normale XNA (il framework su cui sono basate le funzionalità 3D di Silverlight) ha vari metodi GetData() o GetTexture() che penso si possa usare per leggere i risultati di una serie di calcoli. Ma questi metodi equivalenti mancano nelle loro versioni Silverlight 5. Da tutto ciò che posso dire, in Silverlight 5, la GPU è un dispositivo di sola scrittura. Carichi i tuoi shader, carichi i tuoi dati, premi il grilletto e saluti addio. Il tuo codice non vedrà mai più quei byte.

Se si scopre che mi sbaglio, tornerò qui e aggiornerò questa risposta. Ma almeno al momento sembra che sia un vicolo cieco.

[Modifica 10/10/11 - In base a Shawn Hargreaves da MS, questo non è supportato in Silverlight 5. La sua ipotesi sul perché è che (a) sarebbe difficile farlo funzionare in modo coerente su tutti i driver GPU e (b) per tutti tranne una piccola classe di problemi in stile demo-ware, non avrebbe alcun senso. Oh bene.]