Precisamos calcular matrizes de covariância com tamanhos que variam de a . Temos acesso a GPUs e clusters, nos perguntamos qual é a melhor abordagem paralela para acelerar esses cálculos.100000 × 100000
matrix
parallel-computing
gpu
Abra o caminho
fonte
fonte
Respostas:
A primeira coisa é reconhecer que você pode fazer isso usando o BLAS. Se sua matriz de dados é (cada é um vetor de coluna correspondente a uma medida; as linhas são tentativas), você pode escrever a covariância como: Podemos escrever isso como: onde é o vetor de linha com todos os elementos 1, de modo que é um vetor de linha da soma da coluna de . Isso pode ser escrito completamente como BLAS, onde x C i j = E [ x i , x j ] - E [ x i ] E [ x j ] = 1X= [ x1 1x2x3. . . ] ∈ Rm × n x
Suas matrizes de dados e resultados podem ter cerca de 64 GB, portanto, você não vai caber em um único nó ou nas GPUs de um nó. Para um cluster sem GPU, convém consultar o PBLAS , que parece um escalapack. Para GPUs, as bibliotecas de vários nós ainda não estão lá. O Magma possui algum tipo de implementação paralela do BLAS, mas pode não ser fácil de usar. Eu não acho que o CULA faça vários nós ainda, mas é algo para ficar de olho. CUBLAS é um nó.
Eu também sugiro que você considere fortemente implementar o paralelismo, especialmente se você estiver familiarizado com o MPI e precisar conectá-lo a uma base de código existente. Dessa forma, você pode alternar entre CPU e GPU BLAS facilmente e começar e terminar com os dados exatamente onde deseja. Você não precisa de mais do que algumas chamadas MPI_ALLREDUCE .
fonte
Eu implementei a fórmula dada por @Max Hutchinson com CUBlas e Cuda Thrust e comparei com as ferramentas de cálculo de variação on-line. Parece o meu produzindo bons resultados. O código abaixo planejado para QDA Bayes. Portanto, a matriz fornecida pode conter mais de uma classe. Portanto, várias matrizes de co-variação são calculadas. Espero que seja útil para alguém.
fonte