Trabalhando com cálculos diretamente na placa de vídeo
|
Comparando computação tradicional com a computação paralela massiva na placa de vídeo |
Entendendo o Cenário
O C++ AMP é uma extensão do C++ para prover melhor
aproveitamento do processador da placa de vídeo. O C++ AMP não é uma linguagem:
são algumas bibliotecas de C++ que prontas para trabalhar com a placa de vídeo,
intermediada pelo Direct X 11.
O computador pode ter vários aceleradores para cálculos
matemáticos. O WARM é um acelerador emulado criado pela Microsoft. A placa de
vídeo é outro. Como a placa de vídeo possui centenas de núcleos, o desempenho
para cálculos paralelos é notavelmente maior do que o desempenho da CPU.
Em C++ escreve-se códigos com algumas alterações indicando
que cálculos devem ser movidos para ser calculados na placa de vídeo e quais
não vão. Existem códigos que facilitam esta sincronização.
O exemplo deste artigo é um algoritmo que realiza a
multiplicação de matrizes quadradas com diferentes tamanhos. Um temporizador
fica ligado enquanto a execução ocorre. Após isto tem-se o tempo necessário
para execução direta na CPU, para execução direta na GPU.
Configuração do computador(CPU)
Este exemplo foi executado num notebook acer Intel Core i3
com 6 GB de memória RAM, rodando o Windows 8. Mais detalhes estão disponíveis a
seguir:
Time of this report
|
01/10/2013, 15:09:33
|
Operating System
|
Windows 8 Enterprise 64-bit (6.2, Build 9200)
(9200.win8_gdr.130531-1504)
|
Language
|
Portuguese (Regional Setting: Portuguese)
|
System Manufacturer
|
Acer
|
System Model
|
Aspire E1-471
|
BIOS
|
InsydeH2O Version 03.72.02V1.24
|
Processor
|
Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz (4 CPUs), ~2.2GHz
|
Memory
|
6144MB RAM
|
Available OS Memory
|
5980MB RAM
|
Page File
|
4703MB used, 2236MB available
|
DirectX Version
|
DirectX 11
|
System DPI Setting
|
96 DPI (100 percent)
|
DxDiag Version
|
6.02.9200.16384 64bit Unicode
|
Configuração da Placa gráfica (GPU)
A Placa de vídeo utilizada para o cálculo é uma Intel(R) HD
Graphics 3000, onboard, comum de vários notebooks atuais do mercado. Para mais
detalhes veja a seguir:
Card name
|
Intel(R) HD Graphics 3000
|
Manufacturer
|
Intel Corporation
|
Chip type
|
Intel(R) HD Graphics Family
|
DAC type
|
Internal
|
Device Type
|
Full Device
|
Display Memory
|
1760 MB
|
Dedicated Memory
|
128 MB
|
Shared Memory
|
1632 MB
|
Current Mode
|
1366 x 768 (32 bit) (60Hz)
|
Monitor Name
|
Monitor Genérico PnP
|
Monitor Model
|
Unknown
|
Monitor Id
|
AUO183C
|
Native Mode
|
1366 x 768(p) (60.098Hz)
|
Output Type
|
Internal
|
Driver File Version
|
9.17.0010.2932 (English)
|
Driver Version
|
9.17.10.2932
|
Graphics Preemption
|
DMA
|
Compute Preemption
|
DMA
|
Driver Attributes
|
Final Retail
|
Driver Date/Size
|
12/14/2012 02:42:34, 12615680 bytes
|
D3D9 Overlay
|
Supported
|
DXVA-HD
|
Supported
|
DDraw Status
|
Enabled
|
D3D Status
|
Enabled
|
AGP Status
|
Enabled
|
Algorítmo
O algoritmo foi construído com base em exemplos disponíveis gratuitamente
na internet e com base na minha experiência.
Multiplicação de matriz na CPU
Um método chamado
multiply_matrix_cpu
é o responsável por realizar a multiplicação de matrizes na CPU.
|
Multiplicação de Matrizes pela CPU |
Multiplicação de Matriz na GPU
Um método chamado multiply_matrix_gpu
é o responsável por realizar a multiplicação de matrizes na GPU.
|
Multiplicação de Matrizes pela GPU |
Método Principal
No método principal um temporizador é ligado antes e depois
de cada execução. Foram separadas 3 execuções, uma para cada tipo: CPU e GPU. Na tela da aplicação o tempo corrido fica
disponível.
Tempo de execução
A tabela a seguir é uma amostra de tempo em segundos para a
execução.
|
Tabela comparativa para multiplicação de matrizes na CPU e na GPU |
O gráfico valoriza a diferença de tempo de execução entre a
CPU e a GPU. A execução na GPU mostra um desempenho mais acentuado quando
comparada a CPU na matriz de 1024x1024 com a diferença de 12,1s entre a CPU e a GPU.
A execução tradicional da CPU mostrou-se o pior cenário. Chegando
a 13940s (3,8 horas) para multiplicar uma matriz de 8192x8192 contra 9981,02s (2,7 horas) da GPU.
|
Gráfico comparativo para multiplicação de matrizes na CPU e na GPU |
Conclusão
A utilização do C++ AMP para multiplicação de matrizes
quadradas garante uma eficiência de até 1.1 hora para amostras grandes como 8192x8192, que é computado em quase 4 horas na CPU e em quase 3 horas na GPU.
Este exemplo mostra com clareza que a GPU possui considerável superioridade à CPU para realização de cálculos matemáticos.