Sparse Matrix-Vector Multiplication on GPU: When Is Rows Reordering Worthwhile? Paula Prata Instituto de Telecomunicações Departamento de Informática Universidade da Beira Interior João Muranho Instituto de Telecomunicações IMAR – Instituto do Mar, Departamento de Ciências da Vida Universidade de Coimbra
24
Embed
Sparse Matrix-Vector Multiplication on GPU: When Is Rows ...
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Sparse Matrix-Vector Multiplication on GPU:
When Is Rows Reordering Worthwhile?
Paula Prata
Instituto de Telecomunicações
Departamento de Informática
Universidade da Beira Interior
João Muranho
Instituto de Telecomunicações
IMAR – Instituto do Mar,
Departamento de Ciências da Vida
Universidade de Coimbra
Motivação
Evolução da capacidade de cálculo das placas gráficas
(GPUs – Graphics Processing Units).
Desenvolvimento de interfaces de programação para GPU, que
permitem programar a placa gráfica com linguagens de alto nível
( C/C++, Phyton, Java, …):
- CUDA1 (NVIDIA), - Brook+ (AMD/ATI), - OpenCL.
Aumento da investigação sobre como usar a GPU para aplicações
não gráficas:
GPGPU – General Purpose computation on GPU.s .
GPGPU - Áreas de Aplicação
• Problemas com paralelismo de dados , o mesmo código é executado
simultaneamente em diferentes segmentos de dados.
• Exemplos :
- Simulação de modelos moleculares,
- Previsão meteorológica,
- Processamento de sinal, finanças, ...
• Problemas de cálculo cientifico que envolvem a manipulação de matrizes
de grande dimensão .
Vários estudos mostram que para problemas que manipulam matrizes
densas, a GPU permite grandes ganhos de desempenho.
Objetivos
• Estudo da operação: produto matriz esparsa - vector
Operação dominante em problemas de resolução de sistemas de
equações lineares, e no cálculo de valores próprios
Formato de representação de matrizes esparsas condiciona o
desempenho
• Análise do impacto da ordenação das linhas pelo número de elementos
não zero
Formato CSR
Formato ELL
Arquitectura GPU da NVIDIA: GeForce GTX 295
Array de multi-processadores
Arquitectura GPU da NVIDIA: GeForce GTX 295
Cada multiprocessador com:
8 processadores (cores)
Um conjunto de registos
Área de memória partilhada
Uma unidade de operações em virgula flutuante de
precisão dupla (capability 1.3)
Modelo de Programação CUDA
Um programa em execução na CPU (host) pode:
Copiar dados da CPU para a GPU e vice-versa
Lançar a execução de funções na GPU (Kernel.s)
Executar operações de sincronização
…
Cada Kernel é executado por múltiplas threads em simultâneo sobre
diferentes conjuntos de dados
Modelo de execução:
• Em cada multiprocessador – Simple Instruction Multiple Data
• Na GPU – Simple Program Multiple Data.
Modelo de Programação CUDA
Threads agrupadas em blocos
dimensionáveis pelo utilizador.
É criada uma grelha na qual
são distribuídos os blocos de
threads.
Modelo de Programação CUDA
• A grelha é associada à placa gráfica.
• Cada bloco é associado a um multiprocessador.
• As threads de um bloco são executadas pelos núcleos do
multiprocessador associado ao bloco.
• Unidade de
escalonamento ( warp) =32
Hardware e Linguagens
Intel Core 2 Quad Q9550 a 2.83 GHz, com 4 GB de RAM
Nvidia Geforce GTX 295
(30 multiprocessadores, 8 cores cada a 1,24 GHz, 2GB memória
global)
CUDA – versão 2.3
Visual Studio, C/C++
Matrizes: sintéticas e “Williams multi-core benchmarking”
Matrizes Esparsas – Formatos de Armazenamento
1 0 0 2
0 3 0 0
0 4 5 0
0 0 0 6 COO – Coordinate Format
Linhas 0 0 1 2 2 3
Colunas 0 3 1 1 2 3
Valores 1 2 3 4 5 6
Formato CSR – Compressed Sparse Row
0 2 3 5 6
0 3 1 1 2 3
1 2 3 4 5 6
ptr =
índices das colunas=
dados =
Os elementos são armazenados por linhas
Número de
não zeros
Formatos de Armazenamento: CSR
Formatos de Armazenamento: ELL - R
Formato ELLPACK/ITPACK – ELL (ELL-R)
Os elementos são armazenados por colunas:
0 3
1 *
1 2
3 *
1 2
3 *
4 5
6 *
dados = 2
1
2
1
índices = tamanho linhas =
1 3 4 6 2 * 5 *
Algoritmos Estudados
“Thread per row”
Cada linha da matriz é atribuída a uma thread
Formato CSR: as threads de cada warp acedem a posições de
memória não contíguas
Formato ELL: as threads de cada warp acedem a posições
contíguas de memória (mais eficiente)
Algoritmos Estudados
“Warp per row”
Cada linha da matriz é atribuída às threads de um warp
Format CSR: Todas as threads acedem a elementos da
mesma linha logo a posições contíguas de memória
Eficiente se as linhas tiverem tamanho suficiente para todas
as threads terem trabalho (>=32)
Ordenar linhas, porquê?
Modelo de execução SIMD =>
o desempenho é tanto maior quanto, num mesmo warp for:
- menor a divergência no acesso à memória
- menor a divergência de execução
Se num mesmo warp houver threads a processar linhas de diferentes
comprimentos, a execução do warp só termina quando terminar o
processamento da maior das linhas, isto é, da linha que tiver maior
número de valores não zero.
Resultados – matrizes sintéticas
Melhores tempos de execução (em milissegundos) obtidos para
matrizes com 10% de não zeros gerados aleatoriamente
Matrix
order
GPU, CSR (thread per row) GPU, ELL-R (thread per row) GPU, CSR