Examen Final PCA - 1011 -Q1 13 de Enero del 2011

Transcripción

Examen Final PCA - 1011 -Q1 13 de Enero del 2011
Nombre y Apellidos:...................................................................................................................
Examen Final PCA - 1011 -Q1
13 de Enero del 2011
Las notas del examen y de la práctica se publicarán antes del 25 de Enero a las 12:00.
Para hacer la revisión del examen o de la práctica final tenéis que enviar un correo a
[email protected] antes del 25 de Enero a las 23:59.
Instrucciones:
Suponed que estáis trabajando con el ordenador del laboratorio.
1. (1 punto) [10’] Indicad qué herramientas y detalla cuáles son los pasos que realizarías para saber
en qué funciones se invierten o se producen o se ejecutan más: (1) Tiempo de CPU de sistema,
(2) Más llamadas a otras funciones (3) Instrucciones de acceso a memoria en posiciones de pila y (4)
elapsed time.
2. (1 punto) [10’] Escribe el código optimizado del siguiente código, indicando claramente qué técnicas de
optimización estás usando.
int main(int argc, char *argv[])
{
unsigned int k, k_saved, i, n;
unsigned char pop;
if (argc == 1) n = N; else n = atoi(argv[1]);
for (i=0; i<n; i++)
{
k = k_saved = rand();
pop = 0;
while (k > 0)
{
if (k % 2) pop++;
k = k >> 1;
}
fwrite(&k_saved, sizeof(k_saved), 1, stdout);
fwrite(&pop, sizeof(pop), 1, stdout);
}
return 0;
}
3. (1.5 puntos) [20’] Dado el código de producto de matrices:
int C[N][N], A[N][N], B[N][N];
...
void mult1 (int n)
{
int i,j,k;
for ( i=0 ; i < n; i++ )
{
for ( j=0 ; j < n; j++ )
{
for ( k=0 ; k < n ; k++ )
C[i][j]+= A[i][k]*B[k][j];
}
}
}
Responde a las siguientes preguntas, razonando tus respuestas:
(a) ¿Para qué se aplica blocking?
(b) Re-escribe el código de mult1 aplicando la técnica de blocking vista en clase, explicando de
qué estás haciendo blocking.
(c) Justifica los parámetros de blocking que usas para la máquina del laboratorio (Intel Core2 Duo
E8500, 6MB de L2). ¿Creéis que estos parámetros de blocking que habéis realizado mejorará
siempre (para toda N y toda máquina) el rendimiento de la función mult1?.
4. (1.5 puntos) [20’] Analiza los siguientes códigos e indica si hay dependencia de datos. Para cada
dependencia de datos indica de qué tipo es, su distancia y de donde a donde va. Finalmente, una vez
analizadas las dependencias de datos, indica qué códigos son vectorizables y escribe su código vectorial
(psedunotación es suficiente). N es una constante que puede tener cualquier valor.
a)
int a[N], b[N], i;
for (i=0; i<(N-2); i++)
if (b[i]>4)
a[i] = a[i+2] + b[i];
b)
int a[N], i;
for (i=N-1; i>=0; i--)
a[i] = a[i]*5;
c)
int a[N], b[N], i;
for (i=1; i<N; i++)
a[i] = a[i-1] * b[i];
5. (5 puntos) [60’] Programa una versión optimizada del siguiente código, indicando qué técnicas de
optimización usas de las que hemos visto a lo largo del curso y qué aspectos de la arquitectura del
Core2 Duo intentas explotar con ellas:
float calcul(float x, float y, int op)
{
if (op) return x + y;
else return x;
}
void compute (float A[][N], float B[][N], float C[][N], int x, int code)
{
int i, j;
for (j=0; j<N; j++)
for (i=0; i<x; i++)
A[i][j] = (float)(i * N + j);
for (j=0; j<N; j++)
for (i=0; i<x; i++)
C[i][j] = calcul(A[i][j], B[i][j], i%2);
for (j=0; j<N; j++)
for (i=0; i<x; i++)
if (code) C[i][j] *= 2.0;
}

Documentos relacionados