¿Por qué usar SIMD si tenemos GPGPU?

13

Pensé que esta pregunta se sirve mejor en la parte CS de Stack Exchange. Ahora que tenemos GPGPU con lenguajes como CUDA y OpenCL, ¿las extensiones multimedia SIMD (SSE / AVX / NEON) todavía tienen un propósito?

Hace poco leí un artículo sobre cómo se podrían usar las instrucciones SSE para acelerar las redes de clasificación. Pensé que esto era bastante bueno, pero cuando le dije a mi profesor de equipo, se rió y dijo que ejecutar un código similar en una GPU destruiría la versión SIMD. No lo dudo porque SSE es muy simple y las GPU son grandes aceleradores altamente complejos con mucho más paralelismo, pero me hizo pensar, ¿hay muchos escenarios en los que las extensiones SIMD multimedia son más útiles que usar una GPU?

Si las GPGPU hacen que SIMD sea redundante, ¿por qué Intel aumentaría su soporte SIMD? SSE tenía 128 bits, ahora es de 256 bits con AVX y el próximo año será de 512 bits. Si las GPGPU procesan mejor el código con paralelismo de datos, ¿por qué Intel está impulsando estas extensiones SIMD? Es posible que puedan colocar los recursos equivalentes (investigación y área) en un caché más grande y un predictor de ramificación mejorando así el rendimiento en serie.

¿Por qué usar SIMD en lugar de GPGPU?

jonfrazen
fuente
2
Es un desafío en sí mismo alimentar a la GPU con suficientes datos para mantenerla ocupada. La transferencia de datos entre el host y el dispositivo es prácticamente siempre el cuello de botella. Ciertas operaciones son mejor compatibles con las CPU (por ejemplo, multiplicación sin acarreo; ver PCLMULQDQ).
Juho
2
@Juho ¿Los nuevos dispositivos como las APU de AMD no tienen la GPU y la CPU en el mismo dado? ¿Esto elimina el cuello de botella?
jonfrazen
1
Cuando todo está dicho y hecho, una instrucción vectorial sigue siendo una sola instrucción, y el costo para programarla y ejecutarla es igual que cualquier otra instrucción individual. Solo tiene sentido ejecutar trabajos en la GPU cuando el beneficio supera el costo. También considere que obtiene una unidad SIMD por núcleo, pero generalmente solo una GPU por chasis, y la GPU es actualmente un recurso compartido. Esto limita la cantidad de trabajos que puede ejecutar en una GPU. (El número de núcleos aumenta todo el tiempo, pero el número de GPU no lo es.)
Seudónimo
Intel no hace mucho en términos de GPU (aparte de Larrabee / Knights Landing :)), así que supongo que es natural que intenten impulsar AVX. Aunque el uso intensivo de AVX puede ser muy eficiente, ahora da como resultado el downclocking en sus CPU más nuevas, por lo que pueden estar alcanzando límites con algo.
nsandersen

Respuestas:

16

Nada es gratis. Las GPGPU son SIMD. Las instrucciones SIMD en GPGPU tienden a ser más amplias que las instrucciones SIMD en CPU. Las GPGPU tienden a ser multihilo de grano fino (y tienen muchos más contextos de hardware que las CPU). Las GPGPU están optimizadas para la transmisión . Tienden a dedicar un mayor porcentaje de área a unidades de coma flotante, un menor porcentaje de área a caché y un menor porcentaje de área a rendimiento de enteros.

Hagamos una comparación. El núcleo i7-5960x de Intel tiene 8 núcleos, cada uno con SIMD de 4 de ancho (doble precisión), que funciona a 3 GHz (turbo de 3.5 GHz), un caché L3 de 20 M, consume 356 mm ^ 2 y 140 W y cuesta $ 1000. Entonces 8 * 4 * 3 * 4 = 384 GFlops de doble precisión. (El 4x adicional se debe a que puede hacer dos sumas múltiples multiplicadas por carril vectorial por ciclo). Puede realizar 768 GFlops de precisión simple. Eso es aproximadamente 1.08 DP GFlops / mm ^ 2 y 2.75 DP GFlops / Watt. También hay aproximadamente 57.5 KB / mm ^ 2 de caché en chip.

La GeForce GTX Titan Black de NVidia tiene 15 SMX, cada una con SIMD de doble precisión de 32 de ancho, funcionando a 890MHz (turbo de 980MHz), 3.5M de caché L1 + L2, consume 561mm ^ 2, 250W y cuesta $ 1000. Entonces 15 * 32 * .89 * 4 = 1709 GFlops de doble precisión. (El mismo 4x de dos sumas múltiples multiplicadas por carril vectorial por ciclo). Puede hacer 5126 GFlops de precisión simple. Eso es aproximadamente 3.05 DP GFlops / mm ^ 2 y 6.8 DP GFlops / Watt. Entonces, 3 veces la densidad de coma flotante DP por unidad de área y 3 veces la eficiencia de energía de coma flotante DP. ¿Y la compensación? 6.4 KB / mm ^ 2 de caché en chip. Aproximadamente 9 veces menos denso que la CPU.

Entonces, la principal diferencia es que la GPU ha elegido un equilibrio de área que favorece fuertemente el punto flotante (y especialmente el punto flotante de precisión simple) sobre el caché. Incluso ignorando el hecho de que necesita copiar cosas de un lado a otro entre la CPU y la GPU para hacer E / S, lo bien que va a hacer la GPU en comparación con la CPU depende del programa que esté ejecutando.

Si tiene un programa de punto flotante paralelo de datos con muy poca divergencia de control (todos los carriles vectoriales están haciendo lo mismo al mismo tiempo) y su programa está transmitiendo (no puede beneficiarse del almacenamiento en caché), entonces la GPU estará a punto 3 veces más eficiente por unidad de área o por vatio. Pero si tiene una cantidad significativa de control divergente, un trabajo no paralelo a datos que hacer, o podría beneficiarse de grandes estructuras de datos de lectura muchas veces, la CPU probablemente lo hará mejor.

Lógica Errante
fuente