# TEMA 1: Conceptos básicos ## 1. Técnicas estáticas y dinámicas - **Estática:** compilador/programador - **Dinámica:** procesador (runtime) - **Planificación estática:** reordenar instrucciones o scheduling - **Planificación dinámica:** algoritmo en hardware, scheduling dinámico ### Ejemplo 1
Todas pueden tener el prefijo correspondiente a la magnitud (Tera, Giga, Mega...)
La media aritmética castiga un valor bajo. El cociente de la media de N tiempos es igual a la media de aceleraciones. La media aritmética no cumple con esto.
Se pueden comparar dos máquinas respecto a otra de referencia, normalizando respecto a la media geométrica de referencia (nunca la aritmética)
xorpd MMS, MMS, MMS
## 2 .Procesado condicional
La vectorización es incompatible con las sentencias `if/else` hay que hacerlas desaparecer. Se usa la ejecución predicativa de forma: `[COND] INSTRUCCIÓN`
1. Generar V's
2. Generar F's
3. Compactar con máscaras
![[Pasted image 20241201180415.png|400]]
![[Pasted image 20241201180451.png]]
## 3. Modelo del tejado (Roofline Model)
$$ \begin{equation}
GLFOPS=\frac{Nº~FLOPS}{10^9·t_{CPU}}=D_A·AB_{RAM}=\frac{Nº~FLOPS}{1~Byte}·\frac{1~GB}{1~s}
\end {equation} $$
$$ \begin{equation}
\log{(GFLOPS)}=\log{(AB_{RAM})}+1·\log{(D_A)}\text{ queda de la forma: y=ax+b}
\end {equation} $$
![[Imagen de WhatsApp 2024-12-01 a las 17.23.41_327415e6.jpg|]]
A tener en cuenta:
- 2 UF
- Núcleo vectorial AVX (256 bits = 8 x 32 float)
- $\frac{2x8~FLOPS}{1~ciclo}·\frac{F~Gciclos}{1~s}·\text{12 cores en ||}=3GHz=16·3·12~GFLOPS~(techo)$
Siendo la densidad aritmética ideal:
$D_{A,ideal}=\frac{\text{GFLOPS techo}}{AB_{RAM}}=\frac{16·3·12}{48}=12$
# TEMA 5: Thread Level Parallelism (TLP)
### Puntos débiles de un sistema multicore
- Difícil analizar si una app es paralelizable.
- Difícil de hacer DEBUG
- Pensar en vectorial es difícil
- Si el dato es remoto ("sale del computador") $\Rightarrow$ alta latencia (ms).
## 1. Taxonomía de Flynn. Taxonomía según la MP.
Single/Multiple Instruction/Data flows:
- SISD
- SIMD
- MISD
- MIMD
Si atendemos a cómo se organiza la memoria principal (MP):
![[Imagen de WhatsApp 2024-12-02 a las 19.14.00_a8876db6.jpg|400]]
- **UMA (Uniform Memory Access):**
- Tiempo de acceso uniforme para toda dirección.
- También se llaman Multiprocesadores Simétricos (SMP).
- Casi todos los multicore actuales son así.
- Hay cuello de botella en el acceso a memoria.
- **NUMA (Non Uniform Memory Access):**
- Tiempo de acceso no uniforme.
- Compatible con UMA.
- **MPM (Message Passing Machine):**
- Espacio de direcciones distribuido.
- Cada CPU es un computador independiente.
- Escalabilidad fácil excepto en el ancho de banda de lectura (en memoria).
- Comunicación por mensajes (como el S.O.)
Un concepto es escalable si al crecer p (nº CPUs), crece al menos tanto como p.
Toda variable compartida puede dar lugar a problemas de coherencia en Memoria Caché.

#pragma parallel for introduce una barrera de forma implícita
Puede ocurrir un INTERBLOQUEO (deadlock) si se intenta hacer MPI_Recv(...) sin mandar un mensaje con MPI_Send(...)