imagen cambiar el tamaño debe ser común en muchos sitios web que aceptan la subida de imágenes.
Cambio del tamaño de una imagen JPEG de 2600ish x 2000ish 2MB (a 512x512) tomó 23,5 milisegundos en C# con las opciones de calidad más bajas absolutas y el muestreo del vecino más cercano. La función utilizada fue graphics.DrawImage()
basada en uno. El uso de CPU también fue% 21.5.
Procedimientos de extracción "RGBA matriz de bytes" en C# lado y enviarlo a la GPU y cambiar el tamaño de la GPU y conseguir resultados de nuevo en una imagen tomó 6.3 milisegundos y el uso de la CPU fue 12,7%. Esto se hizo con un% 55 gpu más barato con solo 320 núcleos.
Sólo aceleración multiplicador 3.73X.
El factor limitante aquí fue enviar los datos extraídos de 20Mb rgb (¡jpeg es solo 2MB!) A la GPU. ¡Esa parte que consumió mucho tiempo fue casi un 90% del tiempo total, incluida la extracción de matriz de bytes laterales C#! Así que supongo que habría una aceleración de 30X al menos si también se podía hacer una extracción en GPU.
30X no es malo.
¡Entonces podría canalizar la capa de extracción con la capa de cambio de tamaño para ocultar la latencia de copia de memoria para obtener aún más velocidad! Esto podría ser 40X-50X.
Luego aumente la calidad del muestreo (como el bicúbico en lugar del vecino más cercano), tiene aún más ventaja en el lado de la GPU. Agregar un filtro gaussiano 5x5 agregó solo 0.77 milisegundos. La CPU tendría un mayor tiempo además de eso, especialmente si los parámetros de Gauss necesarios son diferentes a la implementación de C# .Net.
Incluso si usted no está satisfecho con la relación de aumento de velocidad, la descarga de GPU y tener un "núcleo libre" en la CPU sigue siendo ventajoso para empujar más trabajo a ese servidor.
Ahora agregue el hecho de los niveles de consumo de energía de la GPU (30W frente a 125W en este ejemplo), es mucho más ventajoso.
CPU no podía ganar en
C[i]=A[i]+B[i]
puntos de referencia cuando ambas partes se ejecutan en los códigos optimizados y todavía se puede descargar la mitad de matrices para la GPU y terminar más rápido el uso de CPU + GPU al mismo tiempo.
GPU no está diseñado para trabajos no uniformes. Las GPU tienen tuberías profundas, por lo que permanecer de pie después de un bloqueo debido a la ramificación lleva demasiado tiempo. También el hardware de tipo SIMD lo obliga a hacer lo mismo en todos los elementos de trabajo. Cuando un elemento de trabajo hace una cosa diferente que el grupo, pierde la pista y agrega burbujas en toda la tubería de SIMD o simplemente otros esperan el punto de sincronización. Por lo tanto, el marcado afecta tanto a las áreas de tuberías profundas como a las amplias y lo hace aún más lento que la CPU en condiciones perfectamente caóticas.
Thrust también acaba de lanzar la versión 1.1. – Eric