Processamento de Alto Desempenho utilizando Unidade de ... ?· PCI Bus Host Device. PCI Bus Host Device…

  • Published on
    17-Feb-2019

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

Francisco Ribacionka e Ettore Enrico (STI ) USP/STI/InterNuvem internuvem@usp.br

Maro - 2016

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Aplicao

+

Cdigo Paralelo

Cdigo Sequencial

Cache

ULAControle

ULA

ULA

ULA

DRAM

DRAM

GPU CPU

Cdigo Sequencial

1. Copiar dados da memria da CPU

para a memria da GPU

PCI Bus

HostDevice

PCI Bus

HostDevice

1. Copiar dados da memria da CPU

para a memria da GPU

2. Carregar o cdigo GPU e executar

PCI Bus

HostDevice

1. Copiar dados da memria da CPU

para a memria da GPU

2. Carregar o cdigo GPU e executar

3. Copiar os resultados da memria da

GPU para a memria da CPU

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

NVIDIA - CUDA

CUDA uma plataforma de computao paralela e um modelo de

programao inventados pela NVIDIA

Linguagens de Programao C, C++, Python, Fortran

CUDA-MPI

Cuda-MPI: Suporte a chamadas MPI a partir da memria da GPU

OpenCL

OpenCL: Suporte a Open Computing Language atravs do CUDA

OpenACC

OpenACC : Acelerando as aplicaes atravs de diretivas de programao

Fonte: https://nvidia.developer.com

Bibliotecas Otimizadas para GPUs

Thrust (C++ Template Library);

cuBLAS (Algebra linear);

cuSPARSE (Algebra linear);

NPP (Processamento de imagem e sinais);

cuFFT (Processamento de imagem e sinais).

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Aplicaes:

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Tesla K20m

GPU 1xGK110

Preciso Simples 3.5 TF

Preciso Dupla 1.2 TF

Memria 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 memria RAM

59 X 16 CPUs Intel Xeon 2.6 GHz

1.26 TFlops

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

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

Computao de alto desempenho HPC

Softwares Instalados na lince que utilizam GPU:

gromacs

lammps

NAMD

Sugestes: hpc@usp.br

#!/bin/bash -v

#PBS -S /bin/bash

#PBS -N cuda

#PBS -l nodes=1:ppn=16

#PBS -l gpus=2

#PBS -joe

#PBS -l walltime= 249:00:00

#PBS -q parallel

ulimit -s unlimited

module load cuda/7.0

cd /scratch/fribacio/1_Utilities/deviceQuery

time ./deviceQuery

Job CUDA:

Recursos

Fila

Comandos para

executar o

programa

$ 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

.... ...

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Computao Heterognea

Terminologia:

Host CPU e a memria RAM

Device GPU e a sua memria

Host Device

24

NVIDIA CUDA

CUDA uma plataforma de computao paralela e um modelo

de programao inventados pela NVIDIA

Linguagens de Programao C, C++, Python, Fortran

Baseado no padro C

Extenses que permitem programao heterognea

APIs para gerenciar memria e dispositivos

Fonte: https://nvidia.developer.com

Computao Heterognea

__global__ void mykernel(void) {

}

int main(void) {

mykernel();

printf(STI-USP\n");

return 0;

}$ nvcc sti_usp.cu

$ a.out

STI-USP

$

26

Soma de dois inteiros:

#include

__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( 2, 7, dev_c );

cudaMemcpy( &c, dev_c, sizeof(int),

cudaMemcpyDeviceToHost );

printf( "2 + 7 = %d\n", c );

cudaFree( dev_c ); return 0;

}27

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Programao Paralela em CUDA

int main( void ) {

int a[N], b[N], c[N];

for (int i=0; i

#include

#define N 10

__global__ void add( int *a, int *b, int *c ) {

int indice = blockIdx.x;

if (indice < N)

c[indice] = a[indice] + b[indice];

}

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

Computao com GPU para paralelismo massivo Como rodar cdigo em paralelo no device?

add>();

add>();

Em vez de executar add() uma vez, executar N vezes emparalelo

Programao Paralela em CUDA

32

__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:

c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; c[3] = a[3] + b[3];

Block 0 Block 1 Block 2 Block 3

Programao Paralela em CUDA

33

Blocos e Grids

Programao

1. Utilizao de GPU para HPC

O que processamento por GPU

Recursos para desenvolvimento de software

Aplicaes

2. Tesla K20m

3. HPC com recursos da InterNuvem: Cluster lince

4. Computao heterognea

Blocos

Threads

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

int tid = threadIdx.x + blockIdx.x * blockDim.x;

add( dev_a, dev_b, dev_c );

int tid = threadIdx.x + blockIdx.x * blockDim.x;

Hierarquia de Memria

Hierarquia de thread

threadIdx um vetor de 3 componentes

Formando blocos de threads de uma, duas ou trs

dimenses

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 (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 Grfico - GPU

Dvidas? hpc@usp.br

Francisco Ribacionka e Ettore Enrico (STI ) USP/STI/InterNuvem internuvem@usp.br

Maro - 2016

Processamento de Alto Desempenho utilizando

Unidade de Processamento Grfico - GPU

Recommended

View more >