Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
FACULTAD DE INGENIERÍA 1 Examen IV: Recorrido de matrices Jorge Luis Téllez González, 315132726 Sistemas Distribuidos - Grupo: 01 Resumen—Este trabajo describe el análisis realizado sobre el impacto que la reorganización de los bucles tiene en la eficiencia del algoritmo de multiplicación de matrices por fuerza bruta, considerando el orden Row-Major de almacenamiento de los elementos de la matriz en memoria. Index Terms—row, major, order, mejor, peor, rendimiento I. INTRODUCCIÓN UN a estructura de datos que permite almacenar y ma-nipular información en una tabla o matriz de dos o más dimensiones se conoce como un arreglo multidimensio- nal. Estas matrices pueden ser indexadas por posición única, lo que permite representar y manipular datos complejos de manera organizada y eficiente. En la computación cientı́fica, los arreglos multidimensionales se utilizan para representar datos de imágenes, videos, sonidos, simulaciones y modelos matemáticos. En programación, se utilizan para almacenar datos en matrices y tablas de múltiples dimensiones, lo que facilita su procesamiento y análisis. En el lenguaje de programación C, la forma en que se acceden los vectores en caché se determina por la forma en que se almacenan los elementos de la matriz en la memoria. En la mayorı́a de las arquitecturas de computadoras modernas, los elementos se almacenan en la memoria en el orden Row Major, lo que significa que los elementos de cada fila de la matriz se almacenan de manera contigua en la memoria y se acceden de manera secuencial, seguidos de los elementos de la siguiente fila. Figura 1: Row Major Order vs Column Major Order. El algoritmo más sencillo para multiplicar 2 matrices y guardar su resultado en otra matriz utiliza tres ciclos ”for” anidados pa- ra recorrer los elementos de las matrices de entrada y calcular los elementos de la matriz resultante. Una gran desventaja se encuentra en su tiempo de ejecución es del orden de O(n3), debido a que el algoritmo no reutiliza los elementos de la matriz que ya se encuentran en caché, sino que los lee varias veces desde la memoria, lo que aumenta significativamente el tiempo de ejecución. for (int i = 0; i<n; i++) for (int j = 0; j<n; j++) for (int k = 0; k<n; k++) C[i][j] += A[i][k] * B[k][j] Es posible mejorar la eficiencia del algoritmo de multiplica- ción de matrices por fuerza bruta y aprovechar la localidad espacial de los datos reorganizando los bucles para acceder a los elementos de la matriz de acuerdo con la forma en que se almacenan en la memoria. Al hacer esto, se asegura que los elementos accesados en un bucle estén cercanos en la memoria caché, mejorando la localidad espacial de los datos y reduciendo el número de accesos a la memoria principal. A continuación, se analizará por qué las reorganizaciones de bucles ikj y kij son más eficientes en comparación con las combinaciones jki y kji, que por otro lado, son las más lentas y de peor rendimiento de forma generalizada. II. DESARROLLO El orden Row-Major implica que los elementos de cada fila de la matriz se almacenan consecutivamente en la memoria, seguidos por los de la siguiente fila. Por lo tanto, aque- llas combinaciones que favorezcan el acceso por filas a los elementos de las matrices serán las que aprovechen mejor la localidad espacial de los datos y, por ende, gozarán de una mejor eficiencia. Para este análisis, se considera como base el trabajo realizado de benchmarks de las diferentes combinaciones de ı́ndices para establecer motivos certeros acerca de los resultados obtenidos previamente en cuanto a las mejores y las peores combinaciones. II-A. Resultados A continuación se presentan las 2 combinaciones más eficaces y las 2 combinaciones más lentas de ı́ndices. II-A1. ikj: La manera más eficiente de multiplicar matrices es reorganizando los bucles mediante la combinación de ı́ndices ikj, ya que de este modo se puede aprovechar mejor la localidad espacial de los datos en la memoria cach accediendo a los elementos de la matriz A en orden de filas en el bucle externo, y en el bucle interno se recorre la matriz B por filas, FACULTAD DE INGENIERÍA 2 de modo que se accede a elementos almacenados juntos en la memoria caché, lo que mejora la localidad espacial de los datos y disminuye la cantidad de accesos a la memoria principal. Figura 2: Orden de acceso a los ı́ndices con ikj. II-A2. kij: La combinación kij también comparte el lugar con la anterior, como las combinaciones de ı́ndices más eficientes para recorrer las matrices en el algoritmo de multiplicación. En esta, se recorren las matrices C y B por filas, mientras que la matriz A se recorre por columnas; lo que impacta en su capacidad de aprovechar el orden de almacenamiento en memoria En cada iteración, se accede a elementos de la matriz A que no están contiguos en la memoria, lo que puede aumentar la cantidad de accesos a la memoria principal y reducir el rendimiento del algoritmo. Figura 3: Orden de acceso a los ı́ndices con kij. II-A3. jki: La combinación de ı́ndices jki es la menos eficiente para la multiplicación de matrices, principalmente a que esta combinación de bucles no aprovecha de ningún modo la localidad espacial de los datos, ya que todas las matrices se recorren por columnas, lo que significa que en cada iteración se accede a elementos que no están contiguos en la memoria. En consecuencia, esto resulta en un mayor número de accesos a la memoria principal y, por lo tanto, un impacto notable en el rendimiento del algoritmo. Figura 4: Orden de acceso a los ı́ndices con jki. II-A4. kji: El arreglo de ı́ndices kji resulta ligeramente mejor que la combinación de ı́ndices jki para la multiplicación de matrices debido a que, aunque ambas combinaciones de bucles no aprovechan bien la localidad espacial de los datos, la combinación kji puede reducir el número de saltos de memoria en comparación con la combinación jki, ya que la matriz B se recorre por filas. El principal problema se encuentra en el modo de acceso no contiguo por columnas en las matrices C y A; hecho que impacta de forma notoria el rendimiento de esta combinación. Figura 5: Orden de acceso a los ı́ndices con kji. III. CONCLUSIONES La multiplicación de matrices es una operación fundamental en muchas aplicaciones, pero puede ser muy costosa compu- tacionalmente, especialmente para matrices grandes. Por lo tanto, mejorar la eficiencia de los algoritmos de multiplicación de matrices es importante para aumentar la velocidad de procesamiento y reducir los costos de operación y el impacto ambiental. Los resultados muestran que las combinaciones de ı́ndices ikj y kij son las más eficientes para la multiplicación de matrices, ya que aprovechan bien la localidad espacial y minimizan el número de saltos de memoria necesarios para acceder a los elementos de la matriz. En cambio, las combinaciones de ı́ndices kji y jki resultaron ser las menos eficientes debido a un gran número de fallos de caché resultado de acceder en forma de columnas a los elementos de las matrices. Es importante tener en cuenta que la elección de la combina- ción de ı́ndices adecuada depende del lenguaje de programa- ción utilizado y cómo se almacenan los elementos de la matriz en la memoria. Si el lenguaje de programación utiliza un orden de almacenamiento de columna principal, como FORTRAN, FACULTAD DE INGENIERÍA 3 entonces las combinaciones kji y jki serı́an las más eficientes, mientras que ikj y kij serı́an las menos eficientes. En general, es importante comprender cómo se almacenan los elementos de la matriz en la memoria y elegir la combinación de ı́ndices adecuada para mejorar la eficiencia de los algoritmos que involucren matrices multidimensionales. BIBLIOGRAFÍA [1] J. Senning. “Matrix Multiplication.” (2020), dirección: http : / / cps . gordon . edu / courses / cps343 / presentations / Matrix Mult.pdf (visitado 08-04-2023). [2] ScratchaPixel. “Row Major vs Column Major Vector.” (),dirección: https : / / www. scratchapixel . com / lessons / mathematics- physics- for- computer-graphics/geometry/ row - major - vs - column - major - vector . html (visitado 08-04-2023). Los créditos de las fotografı́as pertenecen a sus autores. © http://cps.gordon.edu/courses/cps343/presentations/Matrix_Mult.pdf http://cps.gordon.edu/courses/cps343/presentations/Matrix_Mult.pdf https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/row-major-vs-column-major-vector.html https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/row-major-vs-column-major-vector.html https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/row-major-vs-column-major-vector.html Introducción Desarrollo Resultados ikj kij jki kji Conclusiones
Compartir