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; }