Exploração de padrões em matriz para multiplicação eficiente de vetor de matriz

8

Eu tenho a seguinte situação: Eu tenho uma sequência de vetores e para cada eu quero calcular o produto onde é fixado desde o início. Embora não haja informações sobre a estrutura de , normalmente possui um padrão específico em que muitos valores são repetidos e eu gostaria de calcular esses produtos o mais rápido possível.A x i A x i Ax1,x2,..UMAxEuUMAxEuUMA

Um exemplo de é assim:UMA

insira a descrição da imagem aqui

Aqui as regiões brancas são 0.

Gostaria de saber se existe alguma maneira de armazenar informações sobre ou modificá-las de alguma forma que me permita reduzir o número de operações para cada produto. Para linhas com 0, isso é trivial - é possível armazenar apenas as indicações de linha que indicam essas linhas. Também é possível armazenar informações sobre quais linhas são duplicadas para reutilizar os cálculos de linha. Também considerei ordenar as linhas da matriz para minimizar a diferença média entre cada linha e calcular apenas a diferença em cada linha. Isso parece ter problemas para os padrões mais complicados, no entanto.UMA

Eu queria saber se existem métodos conhecidos para esse tipo de problema.

Edit: outra idéia que tive é que desde o não. de valores únicos na matriz é bastante baixo, pode-se decompor o produto como que contém apenas um valor único, mas ainda não tenho certeza se isso pode proporcionar alguma vantagem para esse problema.A iUMAx=UMA1x+UMA2x+UMAnxUMAEu

Slug Pue
fonte
2
Eu posso ver alguns blocos de colunas que, em muitas linhas, são idênticos (por exemplo, um bloco de colunas todo amarelo em muitas linhas). Para um determinado vetor , se você calcular a soma dos elementos de nesse bloco, poderá usá-lo para acelerar as coisas para essas linhas. x ixEuxEu
DW
Se houver valores distintos em uma linha da matriz for muito menor que o número total de elementos em uma linha (o que geralmente ocorre aqui), você precisará usar apenas multiplicações de para calcular o produto escalar dessa linha com o vetor , uma vez que a multiplicação é distribuída pela adição: por exemplo, . dddxumaxEu1+bxEu2+bxEu3+umaxEu4+umaxEu5=uma(xEu1+xEu4+xEu5)+b(xEu2+xEu3)
Jrandom_hacker 14/03
1
1) Dividindo a matriz em blocos, se um bloco tiver todas as linhas iguais, você poderá multiplicar o bloco com um vetor específico uma vez e reutilizar esse produto de ponto parcial para cada linha do bloco. 2) Se um bloco tiver todas as colunas iguais, a otimização por DW funcionará. 3) Se você pode processar em lotes vários vetores, é possível fazer a multiplicação de matrizes na GPU. 4) Se você se decompõe em , pode escrever cada um deles como uma constante vezes uma matriz binária e a multiplicação por uma matriz binária exige apenas acréscimos, portanto, você só precisa de uma multiplicação por valor distinto. UMA1,UMA2,
1
Para ter uma idéia, agora você está usando Blas?
Mauro Vanzetto
1
E agora, como você fabrica o produto? Eu tento fazer uma consideração prática. O uso, direto ou indireto através de outra biblioteca, do Blas permite usar no modo quase ideal o seu hardware (coisa muito difícil de obter por um produto vetorial de matriz personalizado). Então, talvez com o uso do Blas você possa arquivar uma grande velocidade com um esforço limitado.
Mauro Vanzetto

Respostas:

3

Eu sugiro um ponto de vista diferente. Talvez você possa obter uma melhora no desempenho com alguma multiplicação inteligente de matrizes, mas há mais de uma possibilidade de obter pequenos resultados respeitando o esforço.

138×78

É muito difícil, para ser claro, quase impossível para nós, tentar obter o melhor desempenho em relação à função Blas. Os exemplos clássicos são os loops aninhados. Por exemplo, o Atlas, uma implementação específica do Blas, quando instalada, faz um autoajuste no hardware (consulte este pdf ).

Por esse motivo, a primeira sugestão que digo a você é tentar usar uma biblioteca Blas. Veja a página wiki anterior para obter uma lista, existem comerciais ou gratuitas, aqui dependem de você (talvez você possa começar com o OpenBlas). Observe que também existem bibliotecas que usam Blas e são mais confortáveis.

Se isso não for suficiente, tente de outra maneira, mas lembre-se de usar Blas para a multiplicação.

O caso é diferente se o número de zero elementos for cada vez mais, não é o caso, para dar uma idéia de cerca de 90%. Aqui você tem uma matriz esparsa e pode usar métodos de armazenamento diferentes para obter vantagem. Observe que também neste caso você pode encontrar Blas esparsos .

Mauro Vanzetto
fonte
Eu concordo totalmente com esta resposta, especialmente com relação ao que tentar primeiro. Partir de um produto denso de vetor de matriz usando uma biblioteca de álgebra linear altamente otimizada é uma coisa boa e, mais tarde, você poderá comparar quaisquer técnicas inteligentes que encontrar com isso. Se necessário e desejado.
Anton Menshov
0

Isenção de responsabilidade: não tenho idéia se isso realmente vai acelerar o seu cálculo, pois acrescenta um pouco de sobrecarga computacional. Como parece que sua matriz não é muito escassa, é difícil imaginar uma implementação BLAS como a Intel MKL .


Dito isto, aqui está uma idéia:

UMAEuUMAJUMAx

Se você tiver alguns valores na matriz que não possuem duplicatas, poderá jogá-los todos em uma matriz esparsa convencional e fazer o MVP da maneira esparsa "normal" da matriz.

xEu

LedHead
fonte