CRITICAL REVIEW - Benchmark Methodology
CRITICAL REVIEW - Benchmark Methodology
Honestidad Brutal: Análisis del Benchmark HNS
POSIBLES PROBLEMAS IDENTIFICADOS
1. ¿El benchmark mide lo correcto? ⚠️
PROBLEMA POTENCIAL:
# Línea 156: throughput = size / mean_time
Esto asume que cada elemento = 1 operación HNS.
PERO: ¿Es esto correcto?
- Cada elemento HNS tiene 4 componentes (R, G, B, A)
- La suma involucra 4 operaciones individuales + propagación de carry
- ¿Debería contar como 1 operación o como 4-8 operaciones?
SESGO POSIBLE: Si el paper cuenta diferente que yo, los números no son comparables.
2. ctx.finish() incluido en el timing ⚠️
start = time.perf_counter()
shader.run(work_groups, 1, 1)
ctx.finish() # <-- ESTO ESTÁ EN EL TIMING
elapsed = time.perf_counter() - start
PROBLEMA:
ctx.finish()incluye sincronización GPU->CPU- Esto NO es parte del cómputo real
- Puede inflar artificialmente el tiempo (haciendo throughput MENOR)
CONTRAARGUMENTO:
- Si el paper también incluye sincronización, es fair
- Pero NO LO SÉ con certeza
3. ¿Los datos son realistas? ✅ (OK)
data_a = rng.randint(0, 1000, size=(size, 4)).astype(np.float32)
- Datos random entre 0-999 (rango válido para HNS BASE=1000)
- Seed fijado (42) para reproducibilidad
- Esto parece correcto
4. Warmup suficiente? ⚠️
# Warmup
shader.run(work_groups, 1, 1)
ctx.finish()
PROBLEMA:
- Solo 1 iteración de warmup
- GPU modernas pueden tener thermal throttling
- ¿Debería hacer 5-10 warmups?
IMPACTO: Primera medición puede ser más lenta (GPU "fría")
5. Work group calculation ❓
work_groups = (size + 1023) // 1024
PREGUNTA: ¿Esto es correcto para layout(32, 32)?
- 32×32 = 1024 threads per group ✅
- Pero el shader usa 2D layout
- ¿Debería ser work_groups_x y work_groups_y separados?
VERIFICAR: ¿El shader realmente ejecuta correctamente con 1D dispatch?
6. No hay validación de resultados ❌ CRÍTICO
buf_out = ctx.buffer(reserve=size * 16)
# ... ejecuta shader ...
# NUNCA LEE buf_out PARA VALIDAR
PROBLEMA GRAVE:
- NO VERIFICO que el shader calculó correctamente
- Podría estar midiendo operaciones vacías o buggies
- Sin validación, los números no tienen sentido
7. Comparación manzanas vs naranjas? ⚠️
Paper dice "19.8 billion HNS operations per second"
Yo mido: size / mean_time donde size = número de elementos
¿Son lo mismo?
- Si 1 elemento HNS = 1 operación → OK
- Si 1 operación = add de 2 floats → ERROR (HNS hace 4× eso)
PROBLEMAS METODOLÓGICOS SERIOS
❌ 1. NO HAY VALIDACIÓN DE CORRECTITUD
El benchmark NO verifica que los resultados sean correctos.
Podría estar midiendo:
- Shader que no hace nada (optimizado away)
- Shader con bugs
- Operaciones parciales
NECESITO: Leer resultados y validar vs CPU
⚠️ 2. DEFINICIÓN AMBIGUA DE "OPERACIÓN"
¿Qué es 1 operación HNS?
- 1 elemento procesado?
- 1 suma de 4-componentes?
- 1 operación aritmética individual?
Sin claridad, la comparación es inválida.
⚠️ 3. SINCRONIZACIÓN EN EL TIMING
ctx.finish() dentro del loop puede sesgar resultados.
Debería:
- Medir solo
shader.run() - O asegurar que paper hace lo mismo
⚠️ 4. WARMUP INSUFICIENTE
1 iteración puede no calentar GPU adecuadamente.
RECOMENDACIONES PARA BENCHMARK HONESTO
1. Agregar validación de resultados
# Leer resultado
result_data = np.frombuffer(buf_out.read(), dtype=np.float32).reshape(size, 4)
# Validar en CPU
expected = validate_hns_add_cpu(data_a, data_b)
assert np.allclose(result_data, expected), "Shader output incorrect!"
2. Aclarar definición de "operación"
Documentar explícitamente:
- 1 operación = procesar 1 elemento HNS completo (vec4)
- Incluye: 4 sumas + carry propagation = ~8 ops aritméticas
3. Medir sin sincronización
# Versión alternativa
start = time.perf_counter()
for i in range(100): # Batch multiple
shader.run(work_groups, 1, 1)
ctx.finish()
elapsed = time.perf_counter() - start
time_per_op = elapsed / 100
4. Más warmup
# Warmup: 10 iteraciones
for _ in range(10):
shader.run(work_groups, 1, 1)
ctx.finish()
5. Verificar shader dispatch
¿El shader 2D (32×32) funciona con dispatch 1D (work_groups, 1, 1)?
Puede que necesite:
groups_x = int(np.ceil(np.sqrt(size)))
groups_y = groups_x
shader.run(groups_x, groups_y, 1)
VEREDICTO HONESTO
❌ El benchmark TIENE PROBLEMAS
- NO valida correctitud - Crítico
- Definición ambigua - Puede invalidar comparación
- Sincronización en timing - Sesgo posible
- Warmup insuficiente - Sesgo menor
⚠️ Los resultados PUEDEN SER VÁLIDOS pero…
NO PUEDO ESTAR SEGURO sin:
- Validación de resultados
- Aclaración de qué cuenta como "operación"
- Verificar metodología del paper
🔴 RECOMENDACIÓN
NO aceptar estos resultados como definitivos.
Necesito:
- Agregar validación de correctitud
- Comparar metodología exacta con paper
- Posiblemente re-ejecutar con fixes
HONESTIDAD CIENTÍFICA:
Los números (22.75B ops/s) PUEDEN ser correctos PERO mi benchmark NO es suficientemente riguroso para confirmarlo con certeza.
Status: VALIDACIÓN INCOMPLETA ⚠️