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.