Die Bildgrößenanpassung muss auf vielen Websites, die Bilduploads akzeptieren, üblich sein.
Die Größenänderung eines 2600ish x 2000ish 2MB JPEG-Bildes (auf 512x512) benötigte 23,5 Millisekunden in C# mit absolut niedrigsten Qualitätsoptionen und Nearest-Neighbor-Sampling. Verwendete Funktion war graphics.DrawImage()
basierend auf 1. CPU-Auslastung war auch% 21.5.
Die Extraktion von "rgba byte array" auf C# -Seite und das Senden an GPU und die Größenänderung in GPU und das Zurückgeben von Ergebnissen in ein Bild dauerte 6,3 Millisekunden und die CPU-Auslastung betrug% 12.7. Dies wurde mit einem 55% günstigeren GPU mit nur 320 Kernen gemacht.
Nur 3,73X Beschleuniger.
Der limitierende Faktor hier war, die extrahierten 20 MB RGB-Daten (JPEG ist nur 2 MB!) Zu GPU zu senden. Dieser zeitraubende Teil war fast% 90 der gesamten Zeit, einschließlich der C# -Seiten-Byte-Array-Extraktion! Also würde ich sagen, dass es eine 30-fache Beschleunigung geben würde, zumindest wenn die Extraktion auch in der GPU erfolgen könnte.
30X ist nicht schlecht.
Dann können Sie die Extraktionsebene mit der Größenänderungsschicht in die Pipeline leiten, um die Speicherkopienlatenz zu verbergen, um noch schneller zu werden! Dies könnte 40X-50X sein.
Dann erhöhen Sie die Qualität der Probenahme (wie Bikubic statt nächster Nachbar), Sie haben noch mehr Vorteile in der GPU-Seite. Das Hinzufügen eines 5x5-Gauß-Filters fügte nur 0,77 Millisekunden hinzu. Die CPU würde darüber hinaus eine höhere Zeit bekommen, insbesondere wenn die benötigten Gauß-Parameter anders als die C# .Net-Implementierung sind.
Auch wenn Sie mit Beschleunigungs-Verhältnis nicht zufrieden sind, zu GPU ausgelagert und einen „freien Kern“ auf der CPU ist noch vorteilhaft für mehr Arbeit zu diesem Server schieben.
Jetzt fügen Sie die Tatsache der GPU Stromverbrauch Ebenen (30W vs 125W in diesem Beispiel), es ist viel vorteilhafter.
CPU konnte kaum in
C[i]=A[i]+B[i]
Benchmarks gewinnen, wenn beide Seiten auf optimierten Codes laufen und Sie können immer noch Offload Hälfte von Arrays GPU und beenden schneller CPU mit + GPU zugleich.
GPU ist nicht für ungleichmäßige Arbeiten gebaut. GPUs haben tiefe Pipelines, so dass sie aufgrund von Verzweigungen nach einem Stand aufstehen, zu lange brauchen. Auch SIMD-Typ-Hardware zwingt es auf allen Arbeitselementen auf dasselbe zu tun. Wenn ein Arbeitselement eine andere Aufgabe als die Gruppe ausführt, verliert es die Spur und fügt Blasen in der gesamten SIMD-Pipeline hinzu oder andere warten auf den Synchronisationspunkt. Die Abzweigung wirkt sich also sowohl auf tiefe als auch auf breite Pipeline-Bereiche aus und macht sie in perfekt chaotischen Bedingungen sogar langsamer als CPU.
Schub hat auch gerade Version 1.1 freigegeben. – Eric