Processamento de Alto Desempenho utilizando Unidade de Processamento Gráfico - GPU Francisco Ribacionka e Ettore Enrico (STI ) USP/STI/InterNuvem internuvem@usp.br 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
GPU Aplicação Código Sequencial CPU Código Paralelo Controle ULA ULA Cache ULA ULA DRAM DRAM Código Sequencial +
Host Device PCI Bus 1. Copiardados da memóriada CPU para a memóriada GPU
Host Device PCI Bus 1. Copiardados da memóriada CPU para a memóriada GPU 2. Carregaro códigogpu e executar
Host Device PCI Bus 1. Copiardados da memóriada CPU para a memóriada GPU 2. Carregaro códigogpu e executar 3. Copiarosresultadosda memóriada GPU para a memóriada 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++ TemplateLibrary); cublas(algebralinear); cusparse(algebralinear); 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 Precisão Simples Precisão Dupla 1xGK110 3.5 TF 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: hpc@usp.br
Job CUDA: Comandos para executar o programa #!/bin/bash -v #PBS -S /bin/bash #PBS -N cuda Recursos #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 7.0 / 6.5 CUDA Capability Major/Minor version number: 3.5 Total amount of global memory: 4800 MBytes(5032706048 bytes) (13) Multiprocessors, (192) CUDA Cores/MP: 2496 CUDA Cores GPU Clock rate: 706 MHz (0.71 GHz) Memory Clock rate: 2600 Mhz Memory Bus Width: 320-bit L2 Cache Size: 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çãoHeterogênea Terminologia: Host CPU e a memória RAM Device GPU e a sua memória Host Device 24
ComputaçãoHeterogê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çãoParalelaemCUDA
VersãoHost #include <stdio.h> #define N 10 voidadd( int*a, int*b, int*c ) { intindice= 0; while(indice< N) { c[indice] = a[indice] + b[indice]; indice+= 1; } } intmain( void) { inta[n], b[n], c[n]; for (inti=0; i<n; i++) { a[i] = -i; b[i] = i * i; } add( a, b, c ); for (inti=0; i<n; i++) { printf( "%d + %d = %d\n", a[i], b[i], c[i] ); } return 0; } 30
#include <stdio.h> #define N 10 global voidadd( int*a, int*b, int*c ) { int indice = blockidx.x; if(indice< N) c[indice] = a[indice] + b[indice]; } intmain( void) { inta[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 (inti=0; i<n; i++) { a[i] = -i; b[i] = i * i; } VersãoDevice } 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 (inti=0; i<n; i++) { printf( "%d + %d = %d\n", a[i], b[i], c[i] ); } cudafree( dev_a) ; cudafree( dev_b) ; cudafree( dev_c) ; return 0; 31
ProgramaçãoParalelaemCUDA Computação com GPU é para paralelismo massivo Como rodarcódigoemparalelono device? add<<< 1, 1 >>>(); add<<< N, 1 >>>(); Emvezde executaradd()umavez, executarnvezesem paralelo 32
ProgramaçãoParalelaemCUDA global void add(int *a, int *b, int *c) { c[blockidx.x] = a[blockidx.x] + b[blockidx.x]; } Na GPU, cadablocopodeexecutaremparalelo: Block 0 Block 1 Block 2 Block 3 c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; 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]) { inti = threadidx.x; int j = threadidx.y; C[i][j] = A[i][j] + B[i][j]; } Intmain() { // Chamada kernelde um bloco com N * N * 1 threads intnumblocks= 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 Sharedmemper mp: 49152 Registersper 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? hpc@usp.br
Processamento de Alto Desempenho utilizando Unidade de Processamento Gráfico - GPU Francisco Ribacionka e Ettore Enrico (STI ) USP/STI/InterNuvem internuvem@usp.br Março -2016