---
titulo: "Práctica P4c: Laboratorio de profiling con NVIDIA Nsight y comparativa CPU vs GPU"
modulo: M4
ec: EC4
contenido: "4.7, 4.8"
semanas: "13"
horas: 4
tipo: "Laboratorio de rendimiento"
asignatura: "Sistemas Paralelos"
sigla: TEL-420
docente: "Ing. Elias Cassal Baldiviezo"
institucion: "Universidad Autónoma Juan Misael Saracho — Facultad de Ciencias Integradas de Yacuiba / F.I.R.N.T."
---

# P4c · Laboratorio de profiling con NVIDIA Nsight y comparativa de rendimiento CPU vs GPU

**Contenido del programa:** §20.4 · contenidos 4.7 y 4.8  
**Horas de laboratorio:** 4 · **Modalidad:** individual o parejas  

---

## 1. Propósito

Utilizar herramientas profesionales de análisis y perfilado de GPU (**NVIDIA Nsight Systems / Nsight Compute** o línea de comandos `ncu` / `nsys`), midiendo la ocupancia de los multiprocesadores (*Streaming Multiprocessors*), la eficiencia de las transferencias coalescentes (*Memory Coalescing*) y comparando rigurosamente el rendimiento de la multiplicación general de matrices (GEMM) en GPU frente a la CPU multihilo optimizada con OpenMP (Módulo 2).

---

## 2. Fundamentación analítica de GEMM

La multiplicación de matrices $C = A \times B$ de dimensión $N \times N$ involucra $\mathcal{O}(N^3)$ operaciones de punto flotante para $\mathcal{O}(N^2)$ elementos de datos.  
Esta alta **intensidad aritmética** (*Flops/Byte*) convierte a GEMM en el problema arquetípico para demostrar el poder de las GPUs modernas.

### 2.1 Multiplicación por Bloques con Memoria Compartida (Tiled GEMM)
En lugar de que cada hilo lea su fila de $A$ y columna de $B$ de la memoria global $\mathcal{O}(N)$ veces, los hilos de un bloque de $T \times T$ colaboran para cargar submatrices cuadradas en `__shared__ float As[T][T]` y `Bs[T][T]`, reduciendo el tráfico de memoria global en un factor de $T$ (típicamente $16\text{x}$ o $32\text{x}$).

---

## 3. Procedimiento experimental

### Paso 1: Implementación de GEMM en GPU
1. Kernel 1: Implementación elemental 2D (`gemm_naive.cu`) donde cada hilo calcula un elemento $C[i][j]$ leyendo directamente de memoria global.
2. Kernel 2: Implementación con particionamiento por teselas (*Tiled GEMM*) utilizando bloques de memoria compartida de $16 \times 16$ hilos.

### Paso 2: Perfilado con NVIDIA Nsight
Ejecutar la herramienta de línea de comandos para inspeccionar métricas de hardware:

```bash
# Perfilado de métricas de memoria y ocupancia
ncu --metrics sm__throughput.avg.pct_of_peak_sustained_elapsed,gpu__time_duration.sum ./gemm_tiled 2048
```

- Analizar la métrica de ocupancia teórica vs. ocupancia lograda.
- Identificar si el factor limitante es el número de registros por hilo o la memoria compartida por bloque.

### Paso 3: Comparativa cuantitativa CPU vs GPU
Comparar en una misma tabla los tiempos de ejecución para $N \in \{512, 1024, 2048, 4096\}$:
1. CPU Secuencial ($T_1$).
2. CPU Paralelo con OpenMP en 8 núcleos ($T_{omp}$).
3. GPU Naive ($T_{gpu\_naive}$).
4. GPU Tiled con memoria compartida ($T_{gpu\_tiled}$).

---

## 4. Entregables

Informe técnico en PDF evaluado según la [Rúbrica de Informe Comparativo CPU vs GPU](file:///home/eliasdev/sistemas_paralelos/10-modulos/M4-cuda-gpgpu/rubrica-comparativo-cpu-gpu.md) y la [Rúbrica de Perfilado de GPU](file:///home/eliasdev/sistemas_paralelos/10-modulos/M4-cuda-gpgpu/rubrica-perfilado-gpu.md).
