2009-09-12 16 views
16

Me interesa saber si algún algoritmo común (clasificación, búsqueda, gráficos, etc.) se ha portado a OpenCL (o cualquier lenguaje GPU), y cómo el rendimiento se compara con el mismo Algoritmo ejecutado por la CPU. Estoy específicamente interesado en los resultados (números).GPU vs rendimiento de CPU para algoritmos comunes

Gracias!

Respuesta

3

Hay quite a few samples de este tipo de cosas en el sitio web de NVidia. Tenga en cuenta que algunas cosas, como la ordenación necesitan algoritmos especiales para el paralelismo eficiente y puede que no sea tan eficiente como un algoritmo no roscado en un solo núcleo.

9

Las GPU son hardware altamente especializado diseñado para realizar un pequeño conjunto de tareas muy bien y altamente paralelizadas. Esto es básicamente aritmético (particularmente matemáticas de punto flotante de precisión simple, aunque las GPU más nuevas funcionan bastante bien con doble precisión). Como tal, solo son adecuados para algoritmos particulares. No estoy seguro si la clasificación se ajusta a esa categoría (en el caso general al menos).

Ejemplos más comunes son precios de instrumentos financieros, grandes cantidades de matemáticas matriciales e incluso defeating encryption (por fuerza bruta). Dicho esto, encontré Fast parallel GPU-sorting using a hybrid algorithm.

Otro ejemplo comúnmente citado es running [email protected] on an Nvidia GPU pero está comparando manzanas con naranjas. Las unidades de trabajo para GPU son diferentes (y muy limitadas) en comparación con lo que las CPU suelen hacer.

5

Tenga una mirada en thrust:

El empuje es una biblioteca de CUDA paralelas algoritmos con una interfaz se asemeja a la de C++ Standard Template Library (STL). El empuje proporciona una interfaz de alto nivel para la GPU flexibles programación que mejora en gran medida la productividad del desarrollador .

+0

Thrust también acaba de lanzar la versión 1.1. – Eric

4

BE WARY, MUY WARY de cualquier número de rendimiento cotizado para GPGPU. Un montón de gente como para publicar los números realmente impresionantes que no toman en consideración el tiempo de transferencia necesario para obtener los datos de entrada de la CPU a la espalda los datos de salida de la GPU y, tanto pasarse de un cuello de botella PCIe.

+0

Gracias, buen punto. – Chris

+3

Esto es cierto, pero muchos de los ejemplos en la página web de NVIDIA son aplicaciones completas y definitivamente incluyen estos tiempos de transferencia. La verdadera preocupación es: ¿qué tan optimizada es la versión de la CPU en el benchmark? – Eric

0

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.