Processamento de Alto Desempenho utilizando GPU

Transcrição

Processamento de Alto Desempenho utilizando GPU
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Francisco Ribacionka e Ettore Enrico (STI ) – USP/STI/InterNuvem – [email protected]
Março - 2016
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Aplicação
GPU
CPU
Código Sequencial
Controle
Código Paralelo
ULA ULA
ULA ULA
Cache
DRAM
DRAM
Código Sequencial
+
Device
Host
PCI Bus
1. Copiar dados da memória da CPU
para a memória da GPU
Device
Host
PCI Bus
1. Copiar dados da memória da CPU
para a memória da GPU
2. Carregar o código GPU e executar
Device
Host
PCI Bus
1. Copiar dados da memória da CPU
para a memória da GPU
2. Carregar o código GPU e executar
3. Copiar os resultados da memória da
GPU para a memória da CPU
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
NVIDIA - CUDA
• CUDA é uma plataforma de computação paralela e um modelo de
programação inventados pela NVIDIA
• Linguagens de Programação C, C++, Python, Fortran
CUDA-MPI
• Cuda-MPI: Suporte a chamadas MPI a partir da memória da GPU
OpenCL
• OpenCL: Suporte a Open Computing Language através do CUDA
OpenACC
• OpenACC : Acelerando as aplicações através de diretivas de programação
Fonte:
https://nvidia.developer.com
Bibliotecas Otimizadas para GPU’s
•
•
•
•
•
Thrust (C++ Template Library);
cuBLAS (Algebra linear);
cuSPARSE (Algebra linear);
NPP (Processamento de imagem e sinais);
cuFFT (Processamento de imagem e sinais).
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Aplicações:
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Tesla K20m
GPU
1xGK110
Precisão Simples
3.5 TF
Precisão Dupla
1.2 TF
Memória
4.8 GB
Largura de Banda
208 GB/s
# Cores CUDA
2496
Energia
225W
Cluster Jaguar – SGI Altix 450
• 56 CPUs Intel Itanium 2
• 112 GB de RAM
• 0,34 TFlops
Cluster Puma
• Servidores DeLL - Rede Gibabit-ethernet
•59 X 16 GB de memória RAM
•59 X 16 CPUs Intel Xeon 2.6 GHz
• 1.26 TFlops
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Computação de alto desempenho – HPC
•32 servidores, cada um com:
• 2 Tesla k20m
• 16 cores Intel E7-2870 (2,4 GHz)
• 129 GB RAM
•Scratch com 55 TB
•Sistema de filas Torque
Softwares Instalados na lince que utilizam GPU:
• gromacs
• lammps
• NAMD
Sugestões: [email protected]
Job CUDA:
Comandos para
executar o
programa
#!/bin/bash -v
#PBS -S /bin/bash
Recursos
#PBS -N cuda
#PBS -l nodes=1:ppn=16
#PBS -l gpus=2
#PBS -joe
#PBS -l walltime= 249:00:00
#PBS -q parallel
Fila
ulimit -s unlimited
module load cuda/7.0
cd /scratch/fribacio/1_Utilities/deviceQuery
time ./deviceQuery
$ qsub job_cuda.sh
7927.lince.lcca.usp.br
$ qstat
lince.lcca.usp.br:
Req'd
Req'd
Elap
Job ID
Username Queue Jobname SessID NDS TSK Memory Time S Time
-------------- -------------- -------- ------------- ------ ----- ------ ----------- ---------- - -----------7927.lince fribacio parallel cuda
795
1 16
-- 3000:00:0 R 00:00:00
$ ls
cuda.o7927
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 2 CUDA Capable device(s)
Device 0: "Tesla K20m"
CUDA Driver Version / Runtime Version
CUDA Capability Major/Minor version number:
Total amount of global memory:
(13) Multiprocessors, (192) CUDA Cores/MP:
GPU Clock rate:
Memory Clock rate:
Memory Bus Width:
L2 Cache Size:
....
7.0 / 6.5
3.5
4800 MBytes (5032706048 bytes)
2496 CUDA Cores
706 MHz (0.71 GHz)
2600 Mhz
320-bit
1310720 bytes
...
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Computação Heterogênea
Terminologia:
Host
CPU e a memória RAM
Device GPU e a sua memória
Host
Device
24
Computação Heterogênea
NVIDIA – CUDA
• CUDA é uma plataforma de computação paralela e um modelo
de programação inventados pela NVIDIA
• Linguagens de Programação C, C++, Python, Fortran
• Baseado no padrão C
• Extensões que permitem programação heterogênea
• APIs para gerenciar memória e dispositivos
Fonte:
https://nvidia.developer.com
__global__ void mykernel(void) {
}
int main(void) {
mykernel<<<1,1>>>();
printf(“STI-USP\n");
return 0;
}
$ nvcc sti_usp.cu
$ a.out
STI-USP
$
26
Soma de dois inteiros:
#include <stdio.h>
__global__ void add( int a, int b, int *c ) { *c = a + b;}
int main( void ) {
int c; int *dev_c;
cudaMalloc( (void**)&dev_c, sizeof(int) );
add<<<1,1>>>( 2, 7, dev_c );
cudaMemcpy( &c, dev_c, sizeof(int),
cudaMemcpyDeviceToHost );
printf( "2 + 7 = %d\n", c );
cudaFree( dev_c );
return 0;
}
27
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
Programação Paralela em CUDA
Versão Host
#include <stdio.h>
#define N 10
void add( int *a, int *b, int *c ) {
int indice = 0;
while (indice < N) {
c[indice] = a[indice] + b[indice];
indice += 1;
}
}
int main( void ) {
int a[N], b[N], c[N];
for (int i=0; i<N; i++) {
a[i] = -i;
b[i] = i * i;
}
add( a, b, c );
for (int i=0; i<N; i++) {
printf( "%d + %d = %d\n", a[i], b[i], c[i] );
}
return 0;
}
30
#include <stdio.h>
#define N 10
Versão Device
__global__ void add( int *a, int *b, int *c ) {
int indice = blockIdx.x;
if (indice < N)
c[indice] = a[indice] + b[indice];
}
cudaMemcpy( dev_a, a, N * sizeof(int),
cudaMemcpyHostToDevice ) ;
cudaMemcpy( dev_b, b, N * sizeof(int),
cudaMemcpyHostToDevice ) ;
add<<<N,1>>>( dev_a, dev_b, dev_c );
cudaMemcpy( c, dev_c, N * sizeof(int),
cudaMemcpyDeviceToHost ) ;
for (int i=0; i<N; i++) {
printf( "%d + %d = %d\n", a[i], b[i], c[i] );
}
int main( void ) {
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
cudaMalloc( (void**)&dev_a, N * sizeof(int) ) ;
cudaMalloc( (void**)&dev_b, N * sizeof(int) ) ;
cudaMalloc( (void**)&dev_c, N * sizeof(int) ) ;
for (int i=0; i<N; i++) {
a[i] = -i;
b[i] = i * i;
}
cudaFree( dev_a ) ;
cudaFree( dev_b ) ;
cudaFree( dev_c ) ;
return 0;
}
31
Programação Paralela em CUDA
• Computação com GPU é para paralelismo massivo
– Como rodar código em paralelo no device?
add<<< 1, 1 >>>();
add<<< N, 1 >>>();
• Em vez de executar add() uma vez, executar N vezes em
paralelo
32
Programação Paralela em CUDA
__global__ void add(int *a, int *b, int *c) {
c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x];
}
• Na GPU, cada bloco pode executar em paralelo:
Block 0
c[0]
= a[0] + b[0];
Block 1
c[1]
= a[1] + b[1];
Block 2
c[2]
= a[2] + b[2];
Block 3
c[3]
= a[3] + b[3];
33
Blocos e Grids
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Programação
1. Utilização de GPU para HPC
• O que é processamento por GPU
• Recursos para desenvolvimento de software
• Aplicações
2. Tesla K20m
3. HPC com recursos da InterNuvem: Cluster lince
4. Computação heterogênea
• Blocos
• Threads
int tid = threadIdx.x + blockIdx.x * blockDim.x;
int tid = threadIdx.x + blockIdx.x * blockDim.x;
add<<<4,4>>>( dev_a, dev_b, dev_c );
Hierarquia de Memória
Hierarquia de thread
• threadIdx é um vetor de 3 componentes
• Formando blocos de threads de uma, duas ou três
dimensões
• Provendo uma maneira natural para computar vetores,
matrizes ou volumes
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N])
{ int i = threadIdx.x;
int j = threadIdx.y;
C[i][j] = A[i][j] + B[i][j];
}
Int main()
{
// Chamada kernel de um bloco com N * N * 1 threads
int numBlocks = 1;
dim3 threadsPerBlock(N, N);
matAdd<<<numBlocks, threadsPerblock>>> (A, B, C);
...
Modelo de Hardware
SMX: 192
single-precision
CUDA cores, 64
double-precision
units, 32 special
function units (SFU),
and 32 load/store
units (LD/ST).
Tesla K20m
Multiprocessor
count: 13
Shared mem per
mp: 49152
Registers per
mp: 65536
Bibliografia
• SANDERS, J.; KANDROT, E. CUDA by Example - An Introduction to
General-Purpose GPU Programming. Addison-Wesley. 2011
• KIRK, D.; HWU, W. Programming Massively Parallel Processors - A
Hands-on Approach. Morgan Kaufmann. 2010
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Dúvidas? [email protected]
Processamento de Alto Desempenho utilizando
Unidade de Processamento Gráfico - GPU
Francisco Ribacionka e Ettore Enrico (STI ) – USP/STI/InterNuvem – [email protected]
Março - 2016

Documentos relacionados

MINI-CURSO: Introdução à Programação em CUDA

MINI-CURSO: Introdução à Programação em CUDA utilizar o poder computacional de GPUs nVIDIA Extensão da linguagem C, que permite o uso de GPUs: - Suporte a uma hierarquia de grupos de threads - Definição de kernels que são executados na GPU - ...

Leia mais

O Padrão de Projeto Barracuda

O Padrão de Projeto Barracuda para compensar as falhas, na simulação do clima, avaliando a mudança climática global, na modelagem e simulação astrofísica, na indústria petrolífera em que a simulação dos reservatórios de petróle...

Leia mais

artigo - Linux Magazine

artigo - Linux Magazine CUDA Device Query (Runtime API) version (CUDART static linking) There is 1 device supporting CUDA

Leia mais

Programaчуo em Paralelo

Programaчуo em Paralelo Instalação e Documentação do CUDA Instalação do Toolkit, LINUX: Instale com permissões de root: chmod +x c u d a t o o l k i t _ 4 . 2 . 9 _ l i n u x _ ∗ . run . / c u d a t o o l k i t _ 4 . 2 ....

Leia mais