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 A
Um exemplo de é assim:
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.
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 i
fonte
Respostas:
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.
É 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 .
fonte
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:
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.
fonte