Está en la página 1de 2

Pruebas con La Memoria Caché

Lab.01 - Computación Paralela y Distribuida - CSUNSA 2020

Ali Saúl Rojas Valero


arojasval@unsa.edu.pe
EPIE-UNSA, EPCC-UNSA, Arequipa-Perú

https://github.com/ASAROVA/PL01_Pruebas_Cache 2. Implementar en C/C++ la multiplicación de matrices


clásica, la versión de tres bucles anidados y evaluar su
desempeño considerando diferentes tamaños de matriz.
1. Implementar y comparar los 2-bucles anidados FOR
presentados en el cap. 2 del libro, pag 22.
Sobrecargamos el operador * de la clase matriz una vez
Derivamos de la clase vector<vector<T>> una nueva más y allí implementamos el algoritmo de multiplicación de
clase a la que llamamos matriz, en la cual sobrecargamos el matrices con 3 bucles:
operador * para utilizar el anidado convencional ij y creamos
un atributo llamado producto_ji para utilizar el anidado 1 m a t r i z <T> o p e r a t o r * ( c o n s t m a t r i z <T>& M) c o n s t
ji. A continuación mostramos dichos atributos: 2 {
3 i f (M. n f i l a s ! = ncolum )
4 throw i n v a l i d _ a r g u m e n t ( "Dimensiones
1 v e c t o r <T> o p e r a t o r * ( c o n s t v e c t o r <T>& X) c o n s t
incompatibles" ) ;
2 {
5
3 v e c t o r <T> Y( n f i l a s , 0 ) ;
6 m a t r i z <T> P ( n f i l a s ,M. ncolum , T ( ) ) ;
4 f o r ( i n t i = 0 ; i < n f i l a s ; i ++)
7
5 f o r ( i n t j = 0 ; j < ncolum ; j ++)
8 f o r ( i n t i = 0 ; i < n f i l a s ; i ++)
6 Y[ i ] += ( * t h i s ) [ i ] [ j ] * X[ j ] ;
9 {
7 r e t u r n Y;
10 f o r ( i n t j = 0 ; j <M. ncolum ; j ++)
8 }
11 f o r ( i n t k = 0 ; k< ncolum ; k ++)
9
12 P [ i ] [ j ] += ( * t h i s ) [ i ] [ k ] *M[ k ] [ j
10 v e c t o r <T> p r o d u c t o _ j i ( c o n s t v e c t o r <T>& X) c o n s t
];
11 {
13 }
12 v e c t o r <T> Y( n f i l a s , 0 ) ;
14 return P ;
13 f o r ( i n t j = 0 ; j < ncolum ; j ++)
15 }
14 f o r ( i n t i = 0 ; i < n f i l a s ; i ++)
15 Y[ i ] += ( * t h i s ) [ i ] [ j ] * X[ j ] ;
16 r e t u r n Y;
17 }
Realizamos las pruebas con matrices cuadradas de 100 a
1500 elementos por lado y obtenemos los siguientes resulta-
Realizamos las pruebas con matrices cuadradas de 100, 200, dos:
400, 800, 1600, 3200, 6400, 12800 y 25600 elementos por lado
y obtenemos los siguientes resultados:

Figura 1. Comparación de las demoras de la multiplicación matriz-vector para


diversos tamaños de matriz, usando bucles anidados ’ij’ y ’ji’. Obsérvese que
conforme se incrementa la matriz, la ineficiencia del bucle "jirespecto del ïj"se Figura 2. Demoras de la multiplicación de matrices para diversos tamaños
hace más patente. de matriz, usando el algoritmo clásico de los 3 bucles anidados.
3. Implementar la version por bloques (investigar en
internet), seis bloques anidados, evaluar su desempeño y
compararlo con la multiplicación de matrices clásica.
4. Ejecutar ambos algoritmos paso a paso, y analisar el
movimiento de datos entre la memoria principal y la memoria
cache. Hacer una evaluación de acuerdo a la complejidad
algoritmica.
5. Ejecutar ambos algoritmos utilizando las herramientas
valgrind y kcachegrind para obtener una evaluación mas
precisa de su desempeño en términos de cache misses.
R EFERENCIAS
[1] Repositorio: https://github.com/ASAROVA/PL01_Pruebas_Cache.

También podría gustarte