Explotar patrones en matriz para una multiplicación eficiente de matriz-vector

8

I tienen la siguiente situación: Tengo una secuencia de vectores y para cada uno quiero calcular el producto A x i donde A se fija desde el principio. Aunque no hay información sobre la estructura de x i , A generalmente tiene un patrón particular en el que se repiten muchos valores y me gustaría calcular estos productos lo más rápido posible.x1,x2,..AxiAxiA

Un ejemplo de ve así:A

ingrese la descripción de la imagen aquí

Aquí las regiones blancas son 0.

Me pregunto si hay alguna forma de almacenar información sobre o modificarla de alguna manera que me permita reducir el número de operaciones para cada producto. Para las filas que son todas 0, esto es trivial: uno puede almacenar las indicaciones de fila que indican tales filas. También es posible almacenar información sobre qué filas están duplicadas para reutilizar los cálculos de las filas. También he considerado ordenar las filas de la matriz para minimizar la diferencia de medias entre cada fila y solo calcular la diferencia en cada fila. Sin embargo, esto parece tener problemas para los patrones más complicados.A

Me preguntaba si hay algún método conocido para este tipo de problemas.

Ax=A1x+A2x+AnxAi

Babosa Pue
fuente
2
xixi
dddxaxi1+bxi2+bxi3+axi4+axi5=a(xi1+xi4+xi5)+b(xi2+xi3)
1
A1,A2,
1
Para tener una idea, ¿ahora estás usando Blas?
Mauro Vanzetto
1
¿Y ahora cómo haces el producto? Intento hacer una consideración práctica. El uso, directo o indirecto a través de otra biblioteca, de Blas permite usar en modo casi óptimo su hardware (algo muy difícil de obtener con un producto vectorial de matriz personalizado). Entonces, tal vez con el uso de Blas puede archivar una gran velocidad con un esfuerzo limitado.
Mauro Vanzetto

Respuestas:

3

Sugiero un punto de vista diferente. Tal vez pueda obtener una mejora del rendimiento con una multiplicación inteligente de la matriz, pero hay más de una posibilidad de que obtenga pequeños resultados con respecto al esfuerzo.

138×78

Es muy difícil, para ser claros, casi imposibles para nosotros, tratar de obtener el mejor rendimiento respetando la función Blas. Los ejemplos clásicos son los bucles anidados. Por ejemplo, el Atlas, una implementación particular de Blas cuando está instalado, realiza un autoajuste sobre el hardware (consulte este pdf ).

Por esta razón, la primera sugerencia que te digo es que intentes usar una biblioteca Blas. Consulte la página wiki anterior para obtener una lista, hay comercial o gratuita, aquí depende de usted (tal vez pueda comenzar con OpenBlas). Tenga en cuenta que también hay una biblioteca que usa Blas debajo de ellos y son más cómodos.

Si esto no es suficiente, intente con otra forma, pero recuerde usar Blas para la multiplicación.

El caso es diferente si el número de elementos cero es cada vez mayor, no este es el caso, para dar una idea del 90%. Aquí tiene una matriz dispersa y puede usar diferentes métodos de almacenamiento para obtener ventaja. Tenga en cuenta que también en este caso puede encontrar Blas disperso .

Mauro Vanzetto
fuente
Estoy totalmente de acuerdo con esta respuesta, especialmente con respecto a qué probar primero. Comenzar con un producto de matriz-vector denso usando una biblioteca de álgebra lineal altamente optimizada es algo bueno y luego podrá comparar cualquier técnica inteligente que encuentre con eso. Si es necesario y deseado.
Anton Menshov
0

Descargo de responsabilidad: no tengo idea de si esto realmente acelerará su cálculo, ya que agrega bastante sobrecarga computacional. Como parece que su matriz no es muy escasa, es difícil imaginar superar una implementación BLAS como Intel MKL .


Dicho esto, aquí hay una idea:

AIAJAx

Si tiene algunos valores en la matriz que no tienen duplicados, puede arrojarlos a todos en una matriz dispersa convencional y hacer el MVP de la forma de matriz dispersa "normal".

xi

LedHead
fuente