vectores usar usando tutorial suma programar español aplicaciones cuda gpgpu simd computer-architecture cpu-architecture

cuda - usando - ¿Por qué usar SIMD si tenemos GPGPU?



tutorial de cuda en español (2)

Absolutamente SIMD sigue siendo relevante.

En primer lugar, SIMD puede interoperar más fácilmente con el código escalar, ya que puede leer y escribir la misma memoria directamente, mientras que las GPU requieren que los datos se carguen en la memoria de la GPU antes de que se pueda acceder. Por ejemplo, es fácil vectorizar una función como memcmp () a través de SIMD, pero sería absurdo implementar memcmp () cargando los datos a la GPU y ejecutándolos allí. La latencia sería aplastante.

En segundo lugar, SIMD y las GPU son malas para el código altamente ramificado, pero SIMD es algo menos peor. Esto se debe al hecho de que las GPU agrupan varios hilos (un "warp") bajo un único despachador de instrucciones. Entonces, ¿qué sucede cuando los hilos necesitan tomar caminos diferentes: una rama si se toma en un hilo y la rama else se toma en otro? Esto se denomina "divergencia de rama" y es lento: todos los subprocesos "si" se ejecutan mientras los subprocesos "else" esperan, y luego los subprocesos "else" se ejecutan mientras los subprocesos "if" esperan. Los núcleos de la CPU, por supuesto, no tienen esta limitación.

El resultado es que SIMD es mejor para lo que podría denominarse "cargas de trabajo intermedias": cargas de trabajo de hasta tamaño intermedio, con cierto paralelismo de datos, cierta imprevisibilidad en los patrones de acceso, cierta incongruencia. Las GPU son mejores para cargas de trabajo muy grandes que tienen un flujo de ejecución y patrones de acceso predecibles.

(También hay algunas razones periféricas, como una mejor compatibilidad con coma flotante de doble precisión en las CPU).

Ahora que tenemos GPGPUs con idiomas como CUDA y OpenCL, ¿las extensiones SIMD multimedia (SSE / AVX / NEON) aún sirven para un propósito?

Recientemente leí un artículo sobre cómo las instrucciones de SSE podrían usarse para acelerar las redes de clasificación. Pensé que esto era bastante limpio, pero cuando le dije a mi profesor de comp comp él se rió y dijo que ejecutar un código similar en una GPU destruiría la versión de 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 donde las extensiones multimedia SIMD son más útiles que usar una GPU?

Si las GPGPU hacen que SIMD sea redundante, ¿por qué Intel aumentaría su compatibilidad con SIMD? SSE era de 128 bits, ahora es de 256 bits con AVX y el año que viene será de 512 bits. Si las GPGPU son mejores procesando código con paralelismo de datos, ¿por qué Intel impulsa estas extensiones SIMD? Podrían poner los recursos equivalentes (investigación y área) en un caché y predictor de rama más grande, mejorando así el rendimiento de la serie.

¿Por qué usar SIMD en lugar de GPGPU?


La GPU tiene cachés dedicables controlables, la CPU tiene una mejor ramificación. Aparte de eso, el rendimiento de cálculo depende del ancho SIMD, la densidad del núcleo entero y el paralelismo del nivel de instrucción.

También otro parámetro importante es que tan lejos están los datos de una CPU o GPU. (Sus datos podrían ser un búfer OpenGL en una GPU discreta y es posible que deba descargarlo a la RAM antes de computar con la CPU, el mismo efecto se puede ver cuando un búfer de host está en RAM y debe calcularse en una GPU discreta)