Estoy buscando acelerar los productos de vector de matriz, pero todo lo que leo es sobre cómo hacerlo para matrices muy grandes. Mi caso, las matrices son pequeñas, pero la cantidad de veces que se debe hacer es muy grande.
¿Qué métodos, si hay alguno, existen para optimizar esto? ¿Sería más rápido construir una matriz de bloques diagonales realmente grande a partir de las matrices pequeñas y un vector grande hecho de los vectores más pequeños y utilizar las técnicas para las aceleraciones de vectores de matriz grandes? ¿O la configuración de la matriz global y el vector mataría algún beneficio allí?
linear-algebra
optimization
tpg2114
fuente
fuente
Respuestas:
Antes de intentar optimizar su código, vale la pena preguntar si hay algo para optimizar para comenzar. Las bibliotecas que optimizan los productos de matriz de vectores lo hacen al solucionar dos problemas: limitaciones en el tamaño de la memoria caché y la latencia para cargar datos desde la memoria. El primero se realiza mediante el uso de los datos que están actualmente en la memoria caché en toda su extensión para todo lo que necesita ser utilizado antes de reemplazarlo por otros datos, el segundo se realiza mediante la captación previa de datos en la memoria caché antes de usarla realmente.
En su caso, tiene una intensidad aritmética relativamente pequeña de sus datos: carga los datos de la memoria, los usa exactamente una vez y luego pasa a la siguiente matriz. Esto deja solo la segunda vía para optimizar: buscar datos antes de usarlos.
Pero, como dije, antes de intentar optimizar las cosas, puede valer la pena averiguar lo que ya tiene: cronometra cuántos productos de matriz de vectores está haciendo por segundo, calcule cuántos bytes requiere cargar esto desde la memoria en su procesador, y luego compare esto con el ancho de banda del procesador que tiene en su máquina. Puede descubrir que no hay nada que pueda hacer para acelerar las cosas.
fuente
Se puede realmente no importa ya que sus matrices son caché ya contenía, pero debe estar llamando
dgemv()
osgemv()
, o el equivalente de la mejor biblioteca BLAS se puede obtener en sus manos. Debería probar el Intel MKL si puede acceder a él, y también BLIS o ATLAS o una de las muchas bibliotecas BLAS optimizadas que existen.fuente
Generar código C ++ y usar Eigen / Armadillo es una posibilidad, pero esto depende de la aplicación.
Cuide la alineación de la memoria de sus datos (hasta 64 bytes alineados) y restrinja los punteros para facilitar la vida del compilador. No es necesario usar soporte multinúcleo con estos tamaños de matriz, la sobrecarga es mayor que la ganancia.
Usamos secuencias de comandos para generar automáticamente funciones separadas para cada combinación posible y almacenar en caché los punteros de función para llamadas consecutivas.
fuente