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.
Un ejemplo de ve así:
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.
Me preguntaba si hay algún método conocido para este tipo de problemas.
fuente
Respuestas:
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.
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 .
fuente
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:
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".
fuente