Una simulación de 33 millones de microbios corre en una pestaña gracias a WebGPU
Su autor ha reescrito un viejo simulador de evolución en C# para ejecutarlo con compute shaders: 8192 x 4096 posiciones y entre 5 y 10 ticks por segundo con el mapa lleno.

Un desarrollador ha rescatado un simulador de evolución que había escrito hace años en C# y ha movido su lógica central de la CPU a la GPU con WebGPU. El mundo ha pasado de 200 x 200 celdas a 8192 x 4096, unas 33 millones de posiciones que pueden albergar una célula viva, y todo se ejecuta dentro de una pestaña del navegador a entre 5 y 10 ticks por segundo incluso llenando el mapa entero.
De recorrer una lista a repartir el trabajo
El simulador original era de manual: un array bidimensional de objetos, una lista aparte de células vivas y un bucle foreach que ejecutaba la lógica una por una. Cada célula miraba a su alrededor, decidía y modificaba el mundo compartido al instante. Eso tenía una consecuencia que pasaba desapercibida: el orden de iteración formaba parte de las reglas, porque la célula siguiente veía el resultado de las decisiones de la anterior.
En GPU eso no se sostiene. Miles de invocaciones corren en paralelo y no hay orden fiable entre ellas: dos células pueden ver el mismo hueco libre y decidir las dos moverse ahí. La solución pasa por partir cada tick en etapas. Primero cada célula escribe una intención sin tocar el mundo. Después se resuelven los conflictos por posición con una regla fija. Solo entonces se aplica el cambio. Más pases de cómputo y más memoria temporal, a cambio de no depender de un orden de ejecución impredecible.
La memoria manda
Con 33 millones de posiciones, un único valor de 32 bits por posición ya ocupa 128 MiB, y una célula necesita además edad, especie, energía y rasgos. Meter todo eso en un objeto tipo Cell, como se haría en CPU, se dispara: cada campo extra de 4 bytes son otros 128 MiB. En la versión GPU el estado está repartido en varios arrays. Uno dice qué ocupa cada posición, otros guardan energía y rasgos, y el genoma vive a nivel de especie en lugar de duplicarse célula a célula. El reparto no responde solo al consumo de memoria: cada pase de cómputo necesita una parte distinta del estado, y el renderizador no tiene por qué ver las peticiones de movimiento temporales.
El dibujado sigue la misma idea. La versión nueva no mantiene una copia completa del mundo en el lado del procesador: los datos se quedan en la GPU y JavaScript se ocupa de la interfaz, la cámara y los comandos. Al alejar el zoom, una célula acaba ocupando menos de un píxel, así que la vista lejana se construye agregando regiones del mundo: densidad de población, recursos y distribución de especies.
El autor no presenta los 5-10 ticks por segundo como una medida universal de lo que da WebGPU, y lo dice él mismo: depende del GPU, del navegador, de la configuración y del número de células vivas. La demostración está publicada en itch.io.
Más allá de los microbios, el texto es un caso práctico de qué implica mover lógica de CPU a cómputo en GPU. Los tres problemas que aparecen aquí (el orden de ejecución deja de existir, el reparto de buffers condiciona el diseño y el trasvase de datos al procesador se convierte en cuello de botella) son los mismos que se va a encontrar cualquiera que intente lo propio con su código. Ninguno se arregla con un port directo.
