Ejecutar un kernel aparentemente trivial —sumar dos vectores de un millón de floats— esconde una cadena de traducciones y movimientos de datos que este artículo recorre paso a paso. El programa fuente, escrito en CUDA C, se divide en dos ramas: el código del host lo compila el compilador habitual de la máquina, mientras que el código del dispositivo pasa por varias herramientas de NVIDIA. Primero, nvcc invoca a cicc, un compilador basado en LLVM que lo convierte en PTX, una ISA virtual e independiente del hardware con un número infinito de registros tipados. Después, ptxas traduce ese PTX al SASS específico de la arquitectura objetivo, en este caso sm_89 (Ada Lovelace de la RTX 4090), colapsando registros virtuales en registros reales y fusionando instrucciones. El resultado se empaqueta en un archivo cubin (formato ELF) y se integra, junto con el PTX, en un fatbin embebido en el objeto del host.
El artículo desgranado compara las instrucciones generadas en cada nivel: en PTX, formar una dirección requiere tres operaciones explícitas; en SASS, una sola IMAD.WIDE basta. También explica decisiones de diseño como el uso del banco de constantes 0 para los argumentos del kernel (porque todos los hilos leen los mismos punteros y el banco puede servirlos en una sola transacción de broadcast), o el papel de registros especiales como SR_CTAID.X y SR_TID.X para calcular el índice global del hilo. Por último, introduce la QMD, la estructura que el driver envía a la GPU en el lanzamiento y que rellena esos offsets constantes. En conjunto, el texto ofrece un mapa legible de lo que ocurre entre pulsar ejecutar y obtener c[0]=2.0.
