Recientemente me encontré con este artículo , que describe un esquema para ahorrar memoria al representar matrices dispersas. Un número entero de 32 bits puede almacenar números de hasta ~ 4 mil millones. Pero cuando resuelve un PDE, ha ido en paralelo y ha dividido el problema mucho antes de que el número de incógnitas se acerque a los 4 mil millones. Su idea es reordenar la matriz para un ancho de banda pequeño. En lugar de almacenar los índices j
de todas las columnas distintas de cero en una fila dada i
, almacenan el desplazamiento j - i
, que tiende a ser de magnitud pequeña en virtud de la reordenación. Los desplazamientos se pueden almacenar utilizando menos bits que un entero de 32 bits. Hay más aritmética que hacer al iterar sobre las entradas distintas de cero de la matriz, pero los ahorros en menos caché pierden más que compensarlo. En este trabajoestaban buscando específicamente el uso de índices de 16 bits en un formato de matriz jerárquica, pero en última instancia, es una idea similar. También está la biblioteca zfp , que es más para comprimir datos de punto flotante.
Dado que los "flops son gratis" ahora y el cuello de botella es el acceso a la memoria, este tipo de trucos parecen realmente prometedores para hacer un mejor uso del caché de la CPU.
He revisado la mayoría de los trabajos citados / citados de estos dos artículos. Estoy buscando otras referencias sobre la efectividad del empaquetado de bits, la multiplicación escasa de vectores de matriz y cualquier otro problema en la ciencia computacional . Por ejemplo, imagino que podría diseñar estructuras de datos mucho más eficientes para gráficos o mallas no estructuradas utilizando esta idea.
fuente