Regla de oro para el almacenamiento de matriz dispersa vs densa

9

Supongamos que conozco la escasez esperada de una matriz (es decir, el número de ceros / número total posible de ceros). ¿Existe una regla general (tal vez aproximada) para decidir si usar el almacenamiento de matriz dispersa (específicamente, almacenamiento de fila comprimido) en lugar de almacenarlo como una matriz densa?

  1. La velocidad es más importante en mi aplicación que la memoria. Pero por curiosidad general, me interesan las respuestas desde la perspectiva de la velocidad y la memoria.
  2. Después de generar la matriz, solo aplico operaciones de suma y multiplicación en ella.
  3. Solo he podido encontrar respuestas cualitativas, por ejemplo, esta pregunta y esta pregunta, pero estoy buscando algo como

... si la escasez es más de aproximadamente , entonces use almacenamiento denso.X%

EM_IE
fuente

Respuestas:

8

Todas las operaciones matriciales están vinculadas a la memoria (y no vinculadas al cálculo) en los procesadores de hoy. Básicamente, debe preguntar qué formato almacena menos bytes. Esto es fácil de calcular:

  • Para una matriz completa, almacena 8 bytes (uno doble) por entrada
  • Para una matriz dispersa, almacena 12 bytes por entrada (uno doble para el valor y un número entero para el índice de columna de la entrada).

En otras palabras, si su dispersión es inferior al 67%, es decir, para casi cualquier matriz que cualquier persona razonable llamaría dispersa, el formato de matriz dispersa no solo producirá un mejor uso de la memoria sino también un mejor tiempo de cálculo.

Wolfgang Bangerth
fuente
Me gustaría saber por qué alguien ha rechazado esta respuesta. Es cualitativo, cuantitativo y ofrece una buena regla general. Si pudiera votarlo dos veces, lo haría.
Charles
3
Necesitará un poco más de almacenamiento que eso; también necesita realizar un seguimiento de las filas. Un bit por fila es suficiente.
Brian Borchers
3
La multiplicación matriz-matriz de matrices densas es un lugar donde obtiene suficiente reutilización de caché que puede acercarse mucho a los FLOPS máximos. Estoy de acuerdo en que la multiplicación de vectores de matriz tendrá un ancho de banda de memoria limitado.
Brian Borchers
1
El 67% en realidad está muy lejos del punto donde los cálculos se beneficiarían de la escasez. La multiplicación densa matriz-vector puede beneficiarse en gran medida del almacenamiento en caché. (Se necesita un acceso de memoria muy irregular para la multiplicación dispersa de matriz-vector). Si se trata de resolver sistemas lineales con un solucionador directo, a veces las personas dicen que una matriz es dispersa si tiene menos del 0.1% de valores distintos de cero. Pero en la práctica, la conectividad real de las entradas de la matriz es mucho más importante que la cantidad de nonzeros.
Henrik Schumacher
1
@WolfgangBangerth: su definición de escasa ("Escasa" significa que el número de entradas distintas de cero por fila es independiente del tamaño de un conjunto de matrices que se hacen cada vez más grandes), difiere bastante de la definición de JH Wilkinson (trabajo informal) : "cualquier matriz con suficientes ceros que valga la pena aprovecharlos", que a menudo se cita en la literatura. Prefiero la definición de Wilkinson.
wim
11

Por lo que vale, para matrices dispersas aleatorias de tamaño 10,000 por 10,000 versus matrices densas del mismo tamaño, en mi estación de trabajo Xeon usando MATLAB e Intel MKL como BLAS, la multiplicación de matriz-vector dispersa fue más rápida para densidades de 15% o menos. Al 67% (según lo propuesto por otra respuesta ), la densa multiplicación matriz-vector fue aproximadamente tres veces más rápida.

Brian Borchers
fuente
Interesante, gracias. Algunas de mis matrices son hasta un 30-40% dispersas (inconvenientemente entre el 15% y el 67% de las estimaciones), por lo que probablemente debería realizar pruebas similares a las suyas (para las operaciones que me interesan) para ver si la memoria Las ventajas valen la pena.
EM_IE
3
Mucho dependerá del hardware y software que esté utilizando. Mi máquina tiene memoria de cuatro canales, por lo que tiene más ancho de banda de memoria que un sistema de doble canal típico. MKL es un muy buen BLAS y las estructuras de datos de matriz dispersa de MATLAB podrían no estar perfectamente optimizadas para esto.
Brian Borchers
1
Un problema con el almacenamiento de fila comprimido (o el almacenamiento de columna comprimido) es que las entradas generalmente se almacenan en un área diferente en la memoria de la información del índice. Esta falta de localidad puede perjudicar el rendimiento. En comparación, en el almacenamiento convencional de matriz densa (por filas (C) o columnas (Fortran)), puede cargar entradas de la matriz consecutivamente desde la memoria de una manera más eficiente.
Brian Borchers
1
En los últimos años, se han realizado investigaciones sobre nuevos formatos de almacenamiento para matrices dispersas que permiten un rendimiento mejorado para la multiplicación de vectores de matriz dispersos en procesadores mutlcore, máquinas con instrucciones SIMD y GPU. Ver por ejemplo: pdfs.semanticscholar.org/041b/…
Brian Borchers
5

Incluso si una matriz es muy escasa, su producto matriz puede ser denso. Tome, por ejemplo, una matriz diagonal y complete su primera fila y columna con entradas distintas de cero; su producto consigo mismo será completamente denso. Tal matriz puede surgir, por ejemplo, como un gráfico laplaciano de un gráfico en el que hay un vértice que está conectado a todos los demás vértices. En la práctica, es suficiente si hay pocos vértices con conectividad bastante alta con el resto de la red. Para la multiplicación de matriz-vector, este fenómeno es menos relevante, aunque puede conducir a desequilibrios al intentar paralelizar la multiplicación de matriz-vector.

Lo que quiero destacar: Realmente depende del patrón de dispersión y de lo que desea hacer con la matriz. Entonces, la mejor definición de una matriz dispersa que se me ocurre (que es bastante inútil al mismo tiempo) es la siguiente:

Una matriz es escasa si es ventajoso almacenar solo sus valores distintos de cero y sus posiciones e invertir la sobrecarga adicional que proviene de administrar la estructura de datos que surge.

La lección que debe aprender: Realmente depende de lo que quiera hacer con él , qué algoritmo use y (como otros ya lo han señalado) qué hardware y software usará si una matriz dada es escasa o no (lea como: si debe usar una estructura de datos de matriz escasa o densa). No puede haber una regla puramente basada en porcentajes si no se trata solo de almacenar datos o la multiplicación de vectores de matriz. La mejor manera de averiguar si sus matrices son escasas es probarlo y compararlo con los métodos de matriz densa.

Henrik Schumacher
fuente
1
El famoso JH Wilkinson definió una matriz dispersa como: "cualquier matriz con ceros suficientes para que se aproveche de ellas". Exactamente esta definición ha sido citada por otros con frecuencia. Sin embargo, su definición también es bastante adecuada.
wim
1
Agradable. Esa es precisamente la definición que intenté imitar, pero no pude recordar la fuente.
Henrik Schumacher