Recentemente, me deparei com este artigo , que descreve um esquema para economizar memória na representação de matrizes esparsas. Um número inteiro de 32 bits pode armazenar números de até ~ 4 bilhões. Mas quando você resolve um PDE, fica paralelo e particiona o problema muito antes de o número de incógnitas chegar perto dos 4 bilhões. A idéia deles é reordenar a matriz para uma largura de banda pequena. Em vez de armazenar os índices j
de todas as colunas diferentes de zero em uma determinada linha i
, eles armazenam o deslocamento j - i
, que tende a ser pequeno em magnitude em virtude da reordenação. As compensações podem ser armazenadas usando menos bits do que um número inteiro de 32 bits. Há mais aritmética a ser feita ao iterar sobre entradas diferentes de zero da matriz, mas a economia em menos cache perde mais do que compensando isso. No presente trabalhoeles estavam olhando especificamente para usar índices de 16 bits em um formato de matriz hierárquica, mas, no final das contas, é uma ideia semelhante. Há também a biblioteca zfp , que é mais para compactar dados de ponto flutuante.
Como os "fracassos estão livres" agora e o gargalo é o acesso à memória, esses tipos de truques parecem realmente promissores para um melhor uso do cache da CPU.
Examinei a maioria dos trabalhos citados / citados desses dois artigos. Estou procurando outras referências sobre a eficácia do empacotamento de bits, multiplicação esparsa de vetores matriciais e outros problemas da ciência computacional . Por exemplo, imagino que você poderia projetar estruturas de dados muito mais eficientes para gráficos ou malhas não estruturadas usando essa idéia.
fonte