¿Qué debe saber un ingeniero de software de CUDA sobre el hardware subyacente?

Estoy totalmente de acuerdo con la respuesta del usuario de Quora de que un buen conocimiento del hardware de GPU subyacente es esencial para ser una página eficiente de CUDA en el programador. Puedo explicar eso usando ejemplos:

1. Accesos de memoria combinada: uno de los ejemplos más simples para esto es la suma de matrices, donde las matrices (A [filas] [cols] y B [filas] [cols]) se almacenan en el orden principal de la fila. En este caso, la ecuación para la matriz resultante C [cols] [filas] = A [cols] [filas] + [cols] [filas] funcionará más rápido que la ecuación habitual. Desde que se agrega la columna de matrices, se obtienen muchos elementos en lugar de acceder a las filas.

2. Evitar conflictos de bancos de memoria: la mayoría de los programadores de CUDA usan memoria compartida para evitar la latencia de memoria global para cada hilo (si no está en la memoria caché). Pero una consecuencia de esto es el conflicto del banco de memoria, si más de un hilo accede al mismo banco, tienen que ser respondidos en serie.

3. Evitar la divergencia de deformación: en CUDA, una deformación, es decir, 32 hilos ejecuta una sola instrucción en paralelo. Pero una declaración de rama hace que la urdimbre diverja y, por lo tanto, puede conducir a una grave degradación del rendimiento.

Entonces, si el programador conoce el hardware subyacente, ¡el rendimiento será excelente!

Para programar de manera útil en CUDA para GPU, debe conocer al menos la arquitectura básica. Esta información generalmente se cubre en aproximadamente 2 horas en cursos en línea. Es posible que necesite algunos conocimientos básicos de arquitectura de computadoras para comprender ese material.

A menos que tenga una situación extraña con la que no estoy familiarizado, el propósito de escribir código en CUDA es generalmente obtener un mayor rendimiento (con suerte con menos esfuerzo) que el que obtendría en sus procesadores principales. Cuando hicimos un estudio sobre las optimizaciones de CUDA en 2006-7, un puñado de optimizaciones dirigidas y específicas de caso podrían aumentar fácilmente el rendimiento 5 veces sobre una implementación de línea de base, a veces más cuando se usaron las características arquitectónicas apropiadas. Un estudiante graduado con experiencia solo necesitaba repetir un par de veces, y llegó al punto en que conoceríamos la configuración de código óptima para muchos núcleos antes de ejecutarlo por primera vez en CUDA. Algunos estudiantes universitarios nunca obtuvieron más del doble del rendimiento de la línea de base y probablemente fueron programadores de vudú que no entendieron la arquitectura y arrojaron optimizaciones contra la pared para ver qué se quedaba.

En general, considero que la falta de conocimiento del hardware es la razón principal por la que hay relativamente pocos ingenieros de rendimiento de software buenos.

More Interesting

¿Crees que, algún día, crear programas será arrastrar y soltar? ¿Esto reducirá las necesidades de los ingenieros de software, ya que todos podrán programar?

¿Por qué nadie compite con Microsoft y crea una nueva y mejor suite de Microsoft Office?

¿Tener una comida dos veces al día es bueno para los ingenieros de software?

¿Quién ganará más dinero a largo plazo, un cirujano ortopédico, un neurocirujano, un ingeniero de software o un quant?

Si tengo la intención de convertirme en un desarrollador web de software / (back-end), ¿cuáles son los cursos de CS que no sean estructuras de datos y algoritmos que debo tomar?

Tengo 37 años, ¿es demasiado tarde para convertirme en ingeniero de software?

¿Cuál es la diferencia entre ingeniero asociado e ingeniero de software asociado?

¿Hay algún beneficio de hacer la certificación Java en una industria de TI?

¿Por qué te convertiste en ingeniero de software?

¿Apple tiene un problema de retención de ingeniero de software en 2015, y finalmente perjudicará el rendimiento de las acciones de Apple?

¿Qué hacen los ingenieros de software en una empresa comercializadora de energía?

¿Son famosos los programadores?

Como ingeniero de software junior, no soy fuerte con ningún lenguaje de programación fuertemente tipado. ¿Es esto un problema?

Si actualmente es ingeniero de software, ¿cuándo y cómo decidió estudiar informática?

¿Cuáles pueden ser los mejores consejos y pautas para un estudiante de ingeniería de software de último año para su proyecto?