Un sistema capaz de simular millones de entidades en tiempo real, con lógica en CUDA, control en Rust, optimización en ASM y visualización GPU moderna (wgpu).
La mayoría de proyectos:
- GPU = dibuja
Este proyecto:
- GPU = motor de decisiones (CUDA)
- CPU = orquestador (Rust)
Esto es mentalidad de sistemas.
- Misma simulación
- Mismo input
- Mismo output
Aunque corra en GPU. Esto es difícil y muy valorado.
| Stack | Rol | Por qué |
|---|---|---|
| Rust | Orquestación | Seguridad + control |
| GPU Compute | Simulación | Paralelismo real (wgpu/CUDA) |
| ASM | Precisión | Timing / hot paths |
| wgpu | Visualización | GPU moderno |
┌─────────────────────────────────────────────────────────┐
│ RUST (Orquestador) │
│ - Control del ciclo de vida │
│ - Sincronización CPU-GPU │
│ - Gestión de memoria │
└─────────────────┬───────────────────┬───────────────────┘
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────────┐
│ CUDA (Simulación) │ │ wgpu (Render) │
│ - Kernels paralelos │ │ - Instanced rendering │
│ - Millones de threads │ │ - Shaders WGSL │
│ - Compute puro │ │ - GPU moderno │
└─────────────────────────┘ └─────────────────────────────┘
│
▼
┌─────────────────────────┐
│ ASM (Hot Paths) │
│ - RDTSC timing │
│ - Prefetch optimizado │
│ - Memory fences │
└─────────────────────────┘
Cada entidad tiene:
- Posición (x, y)
- Velocidad (vx, vy)
- Energía
- Estado
Reglas simples → Patrones emergentes
🎮 GPU: NVIDIA GeForce RTX 3060
📦 Entities: 1,000,000
⏱️ FPS: 75.0
⏱️ Frame Time: 12.89 ms
🔄 Sim Time: 0.14 ms ← GPU compute
🎨 Render Time: 12.75 ms
| Entidades | Sim Time (GPU) | Frame Time | FPS |
|---|---|---|---|
| 100,000 | ~0.05ms | ~8ms | 120+ |
| 500,000 | ~0.10ms | ~10ms | 100 |
| 1,000,000 | ~0.14ms | ~13ms | 75 |
Resultados reales en RTX 3060
- Rust 1.70+
- CUDA Toolkit 11.0+ (opcional, para GPU compute)
- NASM (opcional, para optimizaciones ASM)
- GPU compatible con Vulkan/DX12/Metal (para wgpu)
cargo run --releasecargo run --release --features cudacargo run --release --features asm_timingcargo run --release --features "cuda,asm_timing"massive_sim_engine/
├── src/
│ ├── main.rs # Entry point
│ ├── engine/ # Motor principal
│ │ ├── mod.rs
│ │ └── state.rs # Estado y ciclo de vida
│ ├── simulation/ # Lógica de simulación
│ │ ├── mod.rs
│ │ ├── entity.rs # Estructura de entidad
│ │ └── cpu_sim.rs # Simulador CPU (fallback)
│ ├── render/ # Renderizado wgpu
│ │ ├── mod.rs
│ │ └── pipeline.rs # Pipeline y shaders
│ ├── asm/ # Código ensamblador
│ │ └── timing.asm # Hot paths de timing
│ ├── cuda/ # Kernels CUDA
│ │ └── simulation.cu # Kernel de simulación
│ ├── asm_bindings.rs # FFI para ASM
│ └── cuda_bindings.rs # FFI para CUDA
├── Cargo.toml
├── build.rs # Script de compilación
└── README.md
- Memory safety sin garbage collector
- Ownership model perfecto para recursos GPU
- Zero-cost abstractions
- Excelente interop con C/CUDA
- Paralelismo masivo real (no threads de CPU)
- wgpu compute shaders: cross-platform (Vulkan, DX12, Metal)
- CUDA disponible para NVIDIA (opcional)
- Determinismo posible con cuidado
- 100k+ entidades en tiempo real
- RDTSC para timing de nanosegundos
- Control de prefetch de cache
- Memory fences explícitos
- Cuando cada ciclo cuenta
- Cross-platform (Vulkan, DX12, Metal)
- API moderna y segura
- Compute shaders disponibles
- Futuro de gráficos en Rust
- Fase 1: Base sólida (Rust + wgpu + render de puntos)
- Fase 2: GPU Compute (wgpu compute shaders, 100k entidades)
- Fase 3: Profiling en tiempo real (métricas GPU, FPS, timing)
- Fase 4: ASM preparado (RDTSC timing, prefetch, memory fences)
- Fase 5: Escala masiva (1M entidades @ 75 FPS)
"Diseñé un motor de simulación masiva capaz de procesar 1 millón de entidades a 75 FPS. La GPU ejecuta la lógica principal mediante compute shaders (wgpu/CUDA), Rust orquesta la ejecución y sincronización del sistema, y ASM está preparado para control preciso de rendimiento con RDTSC. Sistema de profiling en tiempo real para análisis y optimización."
MIT License - Usa este código como quieras.
Construido con 🔥 por un desarrollador que entiende que la infraestructura es otra liga.