Skip to content

Commit c002947

Browse files
authored
docs: authorize safe SIMD strategy (#37)
1 parent d13c569 commit c002947

4 files changed

Lines changed: 97 additions & 8 deletions

File tree

‎Cargo.lock‎

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ name = "rust_performance"
1212
path = "src/lib.rs"
1313

1414
[dependencies]
15+
wide = "1.5.0"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Decisión 0001: SIMD explícito con `wide`
2+
3+
**Estado:** aceptada el 2026-07-29
4+
**Issue:** [#27](https://github.com/jeresoftx/rust-performance/issues/27)
5+
**Ámbito:** capítulo 09, SIMD y límites de vectorización
6+
7+
## Contexto
8+
9+
El curso necesita mostrar SIMD explícito sin abandonar Rust estable ni la
10+
prohibición de `unsafe` declarada por el crate. La auto-vectorización continúa
11+
siendo parte del capítulo, pero no permite explicar por sí sola la
12+
representación de varias operaciones por instrucción.
13+
14+
## Decisión
15+
16+
Se incorpora `wide` `1.5.0` como única dependencia directa para las lecciones
17+
de SIMD explícito. La autorización humana prohíbe `unsafe`, nightly y otras
18+
dependencias directas para este propósito.
19+
20+
## Alternativas consideradas
21+
22+
- **Solo auto-vectorización:** se conserva para comparar el trabajo del
23+
compilador, pero no cubre el modelo explícito.
24+
- **`std::simd` o `portable_simd`:** descartado porque requiere nightly.
25+
- **Intrínsecos de arquitectura:** descartados porque requieren `unsafe` y
26+
atan el ejemplo a una plataforma.
27+
- **Despacho dinámico adicional:** fuera de alcance para una primera lección;
28+
introduciría una segunda preocupación antes del modelo SIMD.
29+
30+
## Consecuencias
31+
32+
- Los ejemplos posteriores usarán solamente la API pública y segura de
33+
`wide`.
34+
- Cada ejemplo SIMD tendrá una implementación escalar de referencia y pruebas
35+
de equivalencia numérica adecuadas para su dominio.
36+
- Los benchmarks declararán arquitectura, compilador, perfil, entrada y
37+
límites; no prometerán aceleración universal.
38+
- Esta decisión no autoriza otras dependencias externas, nightly ni `unsafe`.

‎docs/superpowers/plans/2026-07-29-rust-performance-course.md‎

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ representación operativa. Issues y PRs deben mantenerse alineados con este plan
2525
- [x] Milestones, labels, 33 issues activos y sus campos operativos creados.
2626
- [x] Backlog agrupado por `Milestone`; Roadmap y Critical Path usan layout de
2727
roadmap con fechas cargadas en todos los items.
28-
- [~] #27 queda bloqueado solo para SIMD explícito que requiera `unsafe`,
29-
nightly o una dependencia externa; el resto del plan puede avanzar antes.
28+
- [x] #27 autoriza `wide` `1.5.0` para SIMD explícito sobre Rust estable; se
29+
mantienen prohibidos `unsafe`, nightly y dependencias directas adicionales.
3030

3131
## Objetivo
3232

@@ -43,10 +43,12 @@ justificación e implementación. Cada tema se entrega en tres slices:
4343
especificación, modelo Rust con pruebas y capítulo con ejemplos, ejercicios,
4444
soluciones, diagrama y medición o declaración honesta de por qué no aplica.
4545

46-
El crate inicia sin dependencias y prohíbe `unsafe`. Criterion, un crate de
47-
profiling o SIMD explícito necesitan decisión humana antes de incorporarse. El
48-
capítulo SIMD puede medir auto-vectorización; código SIMD explícito queda
49-
bloqueado hasta la autorización que se registre en #27.
46+
El crate prohíbe `unsafe`. Criterion, un crate de profiling o SIMD explícito
47+
necesitan decisión humana antes de incorporarse. Para el capítulo SIMD se
48+
autorizó `wide` `1.5.0` como única dependencia directa: ofrece tipos SIMD
49+
portables sobre Rust estable sin exponer `unsafe` en el material del curso. El
50+
capítulo también mide auto-vectorización y declara cuándo una conclusión no se
51+
puede generalizar entre arquitecturas.
5052

5153
## Criterio de cierre global
5254

@@ -164,8 +166,8 @@ su dependencia.
164166
|---|---|---|
165167
| #3, #6, #9, #12, #15, #18, #22, #25, #29, #32 | Especificación del capítulo | Ninguno adicional. |
166168
| #4, #7, #10, #13, #16, #20, #23, #26, #30, #33 | Modelo del capítulo | Ninguno adicional. |
167-
| #27 | #26 | Decisión humana solo si se solicita SIMD explícito, `unsafe` o crate externo. |
168-
| #29 | #27 y #28 | No iniciar SIMD explícito sin autorización registrada. |
169+
| #27 | #26 | Decisión humana registrada: `wide` `1.5.0`; sin `unsafe`, nightly ni dependencias directas adicionales. |
170+
| #29 | #27 y #28 | Usar únicamente la estrategia autorizada en #27. |
169171
| #34 | #33 | Ninguno; no marca capítulos como revisados. |
170172

171173
## Contrato de issues y validación
@@ -183,6 +185,26 @@ milestone, labels y están agregados al Project #19.
183185
| Decisión | Alternativas, impacto de dependencias/`unsafe` y autorización humana cuando aplique. |
184186
| Cierre | Índice, enlaces, estados, glosario, ruta de lectura y suite completa. |
185187

188+
## Decisión SIMD explícito: issue #27
189+
190+
Joel autorizó el 2026-07-29 `wide` `1.5.0` para este curso, compatible con
191+
Rust estable. La dependencia se limita a demostrar SIMD explícito de forma
192+
portable y verificable; no convierte una medición local en una afirmación
193+
universal de rendimiento.
194+
195+
| Alternativa | Decisión | Motivo |
196+
|---|---|---|
197+
| Solo auto-vectorización | Complementaria, no suficiente | Sirve para enseñar observación del compilador, pero no el modelo explícito de datos SIMD. |
198+
| `std::simd` / `portable_simd` | Rechazada | Requiere nightly y el curso debe compilar en Rust estable. |
199+
| Intrínsecos por arquitectura | Rechazada | Exigirían `unsafe` y reducirían la portabilidad pedagógica. |
200+
| `wide` `1.5.0` | Aprobada | Expone tipos SIMD portables en Rust estable sin `unsafe` en el código del curso. |
201+
| Dependencia de despacho dinámico adicional | Fuera de alcance | Añadiría complejidad antes de estudiar el modelo básico y no fue autorizada. |
202+
203+
La futura implementación de #29 debe validar resultados numéricos contra una
204+
línea base escalar, medir en el entorno declarado y describir los límites de
205+
arquitectura, tamaño de entrada y precisión. Ningún capítulo se marca como
206+
`reviewed` ni `published` por esta decisión.
207+
186208
## Modo autónomo y siguiente bloque
187209

188210
Con autorización de Joel, cada slice usa `1 issue → 1 rama aislada → 1 commit

0 commit comments

Comments
 (0)