Utilizando computação paralela massiva para cálculos pesados (C++ AMP)


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.