4.1 KiB
4.1 KiB
ASM / C
a) ¿Qué hace el código?
Recorre el array arrayx (empezando por la posición 1) de tamaño N_ITER almacenando en la posición i - 1 la suma del elemento i más el i + 1 entre la constante f11.
b) ¿Cómo se puede escribir en alto nivel?
#define N_ITER 25
float arrayx[N_ITER];
const float f11 = 21.0;
for(int i = 1; i < N_ITER; i++)
{
arrayx[i - 1] = ( arrayx[i] + arrayx[i + 1] ) / f11;
}
c) ¿Son paralelizables directamente?
Sí porque no hay dependencias reales.
#define N_ITER 25
float arrayx[N_ITER];
const float f11 = 21.0;
for(int i = 5; i < N_ITER; i+=5)
{
arrayx[i - 1] = ( arrayx[i] + arrayx[i + 1] ) / f11;
arrayx[i - 2] = ( arrayx[i + 1] + arrayx[i + 2] ) / f11;
arrayx[i - 3] = ( arrayx[i + 2] + arrayx[i + 3] ) / f11;
arrayx[i - 4] = ( arrayx[i + 3] + arrayx[i + 4] ) / f11;
arrayx[i - 5] = ( arrayx[i + 4] + arrayx[i + 5] ) / f11;
}
d) Como la BTB predice siempre tomado ¿cuándo acierta?
La BTB acertará en todas las iteraciones del bucle excepto en la última porque predice salto tomado y no debería tomarlo porque el bucle ha acabado.
!
e) Si la BTB de un GPP es muy sofisticada ¿acertará en los saltos?
...
Visual Studio
La función más paralelizable es pp4() ya que sólo tiene una operación de cada tipo (LD, SF, ADDF, SLTI, ADDI) y no hay saltos condicionales en el bucle.
double pp4()
{
int i;
for (i = 0; i<N_ITER; i++) {
a[i] = a[i] + 8.0;
}
return a[N_ITER - 1];
}
La función que más se parece (parecer en términos de mismo tipo de instrucciones) es pp2().
double pp2()
{
int i;
for (i = 0; i<N_ITER; i++) {
a[i] = 3.14 / sqrt(b[i]+c[i]);
}
return a[N_ITER - 1];
}
Máquina en la que se ejecuta el código real:
!Pasted image 20241022144429.png
Comparativa
pp2() |
nuestro |
|---|---|
| double pp2() { int i; for (i = 0; i<N_ITER; i++) { a[i] = 3.14 / sqrt(b[i]+c[i]); } return a[N_ITER - 1]; } |
# define N_ITER 25 float arrayx[N_ITER]; const float f11 = 21.0; for(int i = 1; i < N_ITER; i++) { arrayx[i - 1] = ( arrayx[i] + arrayx[i + 1] ) / f11; } |
| Este código tiene: - 2x LDF - 1x STF - 1x ADDF - 1x DIVF - 1x constante |
Nuestro código tiene: - 2x LDF - 1x STF - 1x ADDF - 1x DIVF - 1x constante |
Duración de CPI en los bucles
| Release | Debug |
|---|---|
!![]() |
!![]() |
(Todo para config1 y config2)
- CPI (supertomasim)
- CPI (reordenado). Cambiar escalaridad (m=1, m=grande).
- Identificar CPI_bloq
- GFLOPS (o MIPS)
- CPI (pp2 pp4) y Ac
- Cronograma

