Il ridimensionamento delle immagini deve essere comune su molti siti Web che accettano caricamenti di immagini.
Il ridimensionamento di un'immagine jpeg da 2 megabyte 2600ish x 2000ish (a 512x512) ha richiesto 23,5 millisecondi in C# con le opzioni di qualità più bassa e il campionamento del vicinato più vicino. La funzione usata era graphics.DrawImage()
basata su uno. Anche l'utilizzo della CPU era% 21,5.
Ottenere l'estrazione "rgba byte array" sul lato C# e inviarlo a GPU e ridimensionare in GPU e ottenere i risultati in un'immagine ha richiesto 6,3 millisecondi e l'utilizzo della CPU era% 12,7. Questo è stato fatto con una gpu più economica% 55 con solo 320 core.
Solo moltiplicatore di accelerazione 3.73X.
Il fattore limitante è stato, inviando i dati rgb estratti di 20 MB (jpeg è solo 2 MB!) Alla GPU. Quella parte che consuma tempo era quasi 90% del tempo totale, inclusa l'estrazione di array di byte lato C#! Quindi penso che ci sarebbe circa 30X di accelerazione almeno se la parte di estrazione potrebbe essere fatta anche in GPU.
30X non è male.
Quindi è possibile eseguire la pipeline del livello di estrazione con il livello di ridimensionamento per nascondere la latenza della copia di memoria per ottenere ancora più velocità! Questo potrebbe essere 40X-50X.
Quindi aumentare la qualità del campionamento (ad esempio bicubico anziché il vicino più vicino), si ha ancora più vantaggio nel lato GPU. L'aggiunta di un filtro gaussiano 5x5 ha aggiunto solo 0,77 milliseilles. La CPU otterrebbe un tempo più elevato, soprattutto se i parametri gaussiani necessari sono diversi dall'implementazione C# .Net.
Anche se non siete soddisfatti con rapporto di accelerazione, scarico per GPU e con un "core libero" sulla CPU è ancora vantaggioso per la spinta di più lavoro per quel server.
Ora aggiungo il fatto dei livelli di consumo energetico della GPU (30 W rispetto a 125 W in questo esempio), è molto più vantaggioso.
CPU non poteva vincere in
C[i]=A[i]+B[i]
benchmark quando entrambe le parti eseguite su codici ottimizzati e si può ancora scaricare la metà degli array di GPU e finire più veloce utilizzando CPU + GPU allo stesso tempo.
GPU non è stato progettato per lavori non uniformi. Le GPU hanno condutture profonde, quindi stare in piedi dopo uno stallo a causa della ramificazione richiede troppo tempo. Anche l'hardware di tipo SIMD lo obbliga a fare la stessa cosa su tutti i workitems su di esso. Quando un workitem fa una cosa diversa rispetto al gruppo, perde traccia e aggiunge bolle all'intera pipeline SIMD o semplicemente altri attendono il punto di sincronizzazione. Quindi la brancing interessa sia le aree di pipeline profonde che quelle vaste e la rende ancora più lenta della CPU in condizioni perfettamente caotiche.
Anche Thrust ha appena rilasciato la versione 1.1. – Eric