Universidade Federal de Viçosa Departamento de Informática Introdução ao Processamento de Alto Desempenho com GPU (Graphic...
Sumário <ul><li>Arquitetura de Computadores </li></ul><ul><ul><li>Pipeline, cache, loop, multiprocessadores, arranjos de p...
1. Arquitetura de Computadores <ul><li>Pipeline </li></ul><ul><ul><li>Dependencias de Dados </li></ul></ul><ul><ul><ul><li...
1.1 Pipeline D(i)+A(i)*B(i) 4 ciclos Multiplicação 3ciclos – Adição Teremos 7 ciclos para Calcular cada elemento Do vetor ...
1.2 Escalares x = y * w z = x + 3 Sub-utilização dos recursos
1.3 Escalonamento <ul><li>x = y + w </li></ul><ul><li>Z = x + 3 </li></ul><ul><li>A = b + c </li></ul><ul><li>D = 2 * b </...
1.4 Memória <ul><li>Regular </li></ul><ul><li>Densidade Aumenta </li></ul><ul><li>Tempo Acesso ? </li></ul><ul><li>Localid...
1.5 Cache Tempo = 1ns + falhas * 10ns = = 1ns + 2%  *  10ns =  1,2 ns !!!
Lei Amdahl <ul><li>Opção  A </li></ul><ul><li>Fazer a multiplicação 20x mais rápida </li></ul><ul><li>Antes:  100 s </li><...
Processadores ALU Controle Escalonamento Desvios Busca Memorias Caches
Desvios If ( x > lim )  If ( y < th )  If ( z = (a/b*d) )  Processor precisa buscar as instruções Qual a próxima ? 20% des...
Computação Paralela <ul><li>1980 - Anos Dourados </li></ul><ul><li>Muita Pesquisa </li></ul><ul><li>Várias Linguagens, Mod...
Arquiteturas <ul><li>Multiprocessadores </li></ul><ul><li>Um ou mais processadores </li></ul><ul><li>Independentes </li></...
GPU Arquitetura, CUDA, Linguagens, Exemplos
CPU versus GPU <ul><li>Performance de Pico  </li></ul><ul><li>CPU 50-100 Gflops  GPU > 1000 Gflops </li></ul>ALU Cache Con...
Fermi – nova geração <ul><li>3 Bilhoes de transistores </li></ul><ul><li>2x largura de banda memoria </li></ul><ul><li>Cac...
Aplicações <ul><li>Ganhos de aceleração 20x a 150x </li></ul><ul><li>Bioinformática </li></ul><ul><ul><li>Ultrasom, Imagen...
Aplicações
CUDA (Compute Unified Device Architecture) <ul><li>Alto Nível </li></ul><ul><li>Rápida Curva de Aprendizagem </li></ul><ul...
Escalável
História <ul><li>1999 – GPU </li></ul><ul><li>2003: DirectX, OpenGL -> GPGPU </li></ul><ul><ul><li>Modelar aplicacoes com ...
Cuda <ul><li>Codigo Paralelo executa na GPU </li></ul><ul><li>Uma rotina por vez (Kernel) </li></ul><ul><ul><li>Fermi – ma...
Cuda em 1 Slide
Cuda em 1 Slide
Cálculo com Vetor – Versão CPU Suponha N muito grande, 10.000 elementos
Thread, Blocos e Vetores Bloco = 2, Thread 3 Indice = (bloco – 1) * tamanho Bloco + thread =  (2 – 1 ) * 4 + 3 = 7
Versao Paralela em C
Versao em Fortran !  Kernel definition attributes(global)  subroutine ksaxpy( n, a, x, y ) real, dimension(*) :: x,y real,...
Modelo de programação <ul><li>-  Host: executa a aplicação (CPU) </li></ul><ul><li>- Device (GPU) </li></ul><ul><li>Coproc...
Kernel <ul><li>- Executa no dispositivo N vezes em N  threads  em paralelo </li></ul><ul><li>Threads são organizadas em  b...
Threads, Blocos e Grids Exemplo: kernel executando  em 72 threads  Grid 2D com: Dimensão 3×2×1 6 blocos Blocos 2D com: Dim...
Warps, Threads, Blocos & Processadores <ul><li>512 threads - Bloco </li></ul><ul><li>8 thread blocos por SM </li></ul><ul>...
Execução Paralela
Diretivas (em C) <ul><li>Um kernel  =  _global__ </li></ul><ul><li>Kernels podem invocar outras funções que: </li></ul><ul...
Fortran <ul><li>Attributes </li></ul><ul><ul><li>Global – Kernel executa na GPU </li></ul></ul><ul><ul><li>Device – rotina...
Variaveis <ul><li>HOST </li></ul><ul><ul><li>CPU </li></ul></ul><ul><li>DEVICE </li></ul><ul><ul><li>GPU </li></ul></ul><u...
Fortran <ul><li>Definição vetores memória global GPU </li></ul><ul><ul><li>real :: a(100) </li></ul></ul><ul><ul><li>attri...
Transferencia dados em fortran <ul><li>a, b e c na CPU </li></ul><ul><li>Adev na GPU </li></ul><ul><ul><li>a = adev </li><...
Programa básico em C para CUDA <ul><li>Seleção do dispositivo a ser usado cudaSetDevice() </li></ul><ul><li>Alocação de me...
Média em Paralelo
Arranjo de multiprocessadores (SMs) <ul><li>Cada SM =  8 processadores (Sps), 1 unidade de instrução, Memória compartilhad...
Arranjo de multiprocessadores (SMs)
Warps e Threads <ul><li>Os Threads de cada bloco são executados em pacotes </li></ul><ul><li>Os pacotes são os WARP que te...
Modelo de Memória <ul><li>Memória compartilhada do bloco da thread </li></ul><ul><li>Visível para todas as threads do bloc...
Acessos Paralelos a Memória
Memória Compartilhada - Mesmo bloco e 16Kb - Acesso 400 a 600 mais rápido que memória global Permite  colaboração  entre t...
Codigo de Multiplicacao Matrizes ! start the module containing the matmul kernel module mmul_mod use cudafor contains ! mm...
continua... ! Get the thread indices tx = threadidx%x ty = threadidx%y ! This thread computes C(i,j) = sum(A(i,:) * B(:,j)...
continua.... Multiply the two submatrices ! Each of the 16x16 threads accumulates the ! dot product for its element of C(i...
Na CPU.... ! The host routine to drive the matrix multiplication subroutine mmul( A, B, C ) real, dimension(:,:) :: A, B, ...
Continua.... ! Copy A and B to the device Adev = A(1:N,1:M) Bdev(:,:) = B(1:M,1:L) ! Create the grid and block dimensions ...
Dicas <ul><li>Estratégias básicas </li></ul><ul><li>Maximização da execução em paralelo </li></ul><ul><li>- Estruturação d...
Fermi <ul><li>512 CUDA cores </li></ul><ul><li>32 Cores/SM </li></ul><ul><li>16 SM </li></ul><ul><li>4x more core/SM than ...
2 warps por SM <ul><li>Cada SM tem </li></ul><ul><li>2 warp  </li></ul><ul><li>Exceto: Double Precision </li></ul>Warp Sch...
Dupla Precisão <ul><li>Full IEEE 754-2008  </li></ul><ul><li>16 precisão dupla FloatMultAdd  ops/SM </li></ul><ul><li>8x p...
Cache <ul><li>64 KB on-chip configurable memory/SM </li></ul><ul><li>16 KB L1 cache + 48 KB Shared memory </li></ul><ul><l...
Upcoming SlideShare
Loading in …5
×

Inpe

796 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
796
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
16
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Inpe

  1. 1. Universidade Federal de Viçosa Departamento de Informática Introdução ao Processamento de Alto Desempenho com GPU (Graphic Processor Units) Ricardo Ferreira [email_address]
  2. 2. Sumário <ul><li>Arquitetura de Computadores </li></ul><ul><ul><li>Pipeline, cache, loop, multiprocessadores, arranjos de processadores </li></ul></ul><ul><li>GPU </li></ul><ul><ul><li>Aplicações </li></ul></ul><ul><ul><li>Arquitetura </li></ul></ul><ul><ul><li>Linguagens C e Fortran </li></ul></ul><ul><ul><li>CUDA </li></ul></ul><ul><ul><li>Exemplos </li></ul></ul>
  3. 3. 1. Arquitetura de Computadores <ul><li>Pipeline </li></ul><ul><ul><li>Dependencias de Dados </li></ul></ul><ul><ul><ul><li>a = b*c/3.5 </li></ul></ul></ul><ul><ul><ul><li>d = a + sin(x) - Depende de a </li></ul></ul></ul><ul><ul><ul><li>y = x/w + x/t - não depende </li></ul></ul></ul><ul><ul><li>Escalonamento </li></ul></ul><ul><ul><li>Desvios </li></ul></ul><ul><li>Cache </li></ul><ul><li>Multiprocessadores e Arranjos </li></ul>
  4. 4. 1.1 Pipeline D(i)+A(i)*B(i) 4 ciclos Multiplicação 3ciclos – Adição Teremos 7 ciclos para Calcular cada elemento Do vetor Pipeline -> 1 operação por ciclo !!!
  5. 5. 1.2 Escalares x = y * w z = x + 3 Sub-utilização dos recursos
  6. 6. 1.3 Escalonamento <ul><li>x = y + w </li></ul><ul><li>Z = x + 3 </li></ul><ul><li>A = b + c </li></ul><ul><li>D = 2 * b </li></ul><ul><li>C = e * f </li></ul><ul><li>ANTES </li></ul><ul><li>x = y + w </li></ul><ul><li>A = b + c </li></ul><ul><li>D = 2 * b </li></ul><ul><li>C = e * f </li></ul><ul><li>Z = x + 3 </li></ul><ul><li>DEPOIS </li></ul>Estático – Compilador Dinâmico – Processador (1963) Fortran 1957, C 1969
  7. 7. 1.4 Memória <ul><li>Regular </li></ul><ul><li>Densidade Aumenta </li></ul><ul><li>Tempo Acesso ? </li></ul><ul><li>Localidade </li></ul><ul><ul><li>Espacial </li></ul></ul><ul><ul><li>Temporal </li></ul></ul>antes depois
  8. 8. 1.5 Cache Tempo = 1ns + falhas * 10ns = = 1ns + 2% * 10ns = 1,2 ns !!!
  9. 9. Lei Amdahl <ul><li>Opção A </li></ul><ul><li>Fazer a multiplicação 20x mais rápida </li></ul><ul><li>Antes: 100 s </li></ul><ul><li>Depois </li></ul><ul><li>90 + 10/20 = 90,5s </li></ul><ul><li>Opção B </li></ul><ul><li>Fazer a memória 2x mais rápida </li></ul><ul><li>Antes: 100 s </li></ul><ul><li>Depois </li></ul><ul><li>100/2 = 50s </li></ul>
  10. 10. Processadores ALU Controle Escalonamento Desvios Busca Memorias Caches
  11. 11. Desvios If ( x > lim ) If ( y < th ) If ( z = (a/b*d) ) Processor precisa buscar as instruções Qual a próxima ? 20% desvios nos codigos.....
  12. 12. Computação Paralela <ul><li>1980 - Anos Dourados </li></ul><ul><li>Muita Pesquisa </li></ul><ul><li>Várias Linguagens, Modelos </li></ul><ul><li>Construção Computadores </li></ul><ul><li>Porém </li></ul><ul><ul><li>Não se vendeu nada..... </li></ul></ul><ul><ul><li>Não se popularizou..... </li></ul></ul>
  13. 13. Arquiteturas <ul><li>Multiprocessadores </li></ul><ul><li>Um ou mais processadores </li></ul><ul><li>Independentes </li></ul><ul><li>Multi-Core </li></ul><ul><li>Arranjo de Processadores </li></ul><ul><li>Mesma Instrução </li></ul><ul><li>Vários Dados </li></ul><ul><li>SIMD (single instruction Multiple Data) </li></ul><ul><li>GPU </li></ul>
  14. 14. GPU Arquitetura, CUDA, Linguagens, Exemplos
  15. 15. CPU versus GPU <ul><li>Performance de Pico </li></ul><ul><li>CPU 50-100 Gflops GPU > 1000 Gflops </li></ul>ALU Cache Controle
  16. 16. Fermi – nova geração <ul><li>3 Bilhoes de transistores </li></ul><ul><li>2x largura de banda memoria </li></ul><ul><li>Caches L1 e L2 </li></ul><ul><li>8X dupla precisao </li></ul><ul><li>ECC (erro) </li></ul><ul><li>C++ </li></ul>
  17. 17. Aplicações <ul><li>Ganhos de aceleração 20x a 150x </li></ul><ul><li>Bioinformática </li></ul><ul><ul><li>Ultrasom, Imagens </li></ul></ul><ul><ul><li>Redes de Proteinas </li></ul></ul><ul><ul><li>DNA </li></ul></ul><ul><li>Fisica </li></ul><ul><ul><li>Particulas, astrofisica </li></ul></ul><ul><li>DataMining </li></ul>
  18. 18. Aplicações
  19. 19. CUDA (Compute Unified Device Architecture) <ul><li>Alto Nível </li></ul><ul><li>Rápida Curva de Aprendizagem </li></ul><ul><li>Linguagens (familiar) </li></ul><ul><ul><li>C </li></ul></ul><ul><ul><li>Fortran (2010) </li></ul></ul><ul><li>Escalavel: independente do número de processadores </li></ul><ul><li>100 milhões de placas no mercado </li></ul><ul><li>Alto Desempenho a baixo custo </li></ul>
  20. 20. Escalável
  21. 21. História <ul><li>1999 – GPU </li></ul><ul><li>2003: DirectX, OpenGL -> GPGPU </li></ul><ul><ul><li>Modelar aplicacoes com imagens (textura...) </li></ul></ul><ul><li>2006/2007 – CUDA </li></ul><ul><ul><li>GeForce8800 </li></ul></ul><ul><ul><li>Fx5600 </li></ul></ul><ul><ul><li>Tesla C870 </li></ul></ul><ul><li>2009/2010 – Fortran e C++ </li></ul><ul><li>2009/2010 – Arquitetura Fermi </li></ul>
  22. 22. Cuda <ul><li>Codigo Paralelo executa na GPU </li></ul><ul><li>Uma rotina por vez (Kernel) </li></ul><ul><ul><li>Fermi – mais kernels em paralelo </li></ul></ul><ul><li>CPU pode ser usada em paralelo </li></ul><ul><li>Modelar dados com Vetores </li></ul><ul><ul><li>Cada elemento do vetor é calculado em um thread </li></ul></ul><ul><ul><li>Thread são organizados em Blocos </li></ul></ul>
  23. 23. Cuda em 1 Slide
  24. 24. Cuda em 1 Slide
  25. 25. Cálculo com Vetor – Versão CPU Suponha N muito grande, 10.000 elementos
  26. 26. Thread, Blocos e Vetores Bloco = 2, Thread 3 Indice = (bloco – 1) * tamanho Bloco + thread = (2 – 1 ) * 4 + 3 = 7
  27. 27. Versao Paralela em C
  28. 28. Versao em Fortran ! Kernel definition attributes(global) subroutine ksaxpy( n, a, x, y ) real, dimension(*) :: x,y real, value :: a integer, value :: n, I i = (blockidx%x-1) * blockdim%x + threadidx%x if( i <= n ) y(i) = a * x(i) + y(i) end subroutine ! Host subroutine subroutine solve( n, a, x, y ) real, device, dimension(*) :: x, y real :: a integer :: n ! call the kernel call ksaxpy<<<n/64, 64>>>( n, a, x, y ) end subroutine
  29. 29. Modelo de programação <ul><li>- Host: executa a aplicação (CPU) </li></ul><ul><li>- Device (GPU) </li></ul><ul><li>Coprocessador da CPU </li></ul><ul><li>Executa kernels </li></ul><ul><li>Ciclo de execução </li></ul><ul><li>Aloca memória no dispositivo </li></ul><ul><li>Transfere dados de entrada para o dispositivo </li></ul><ul><li>Dispara a execução de kernels </li></ul><ul><li>Transfere dados resultantes do dispositivo </li></ul><ul><li>Libera memória no dispositivo </li></ul>
  30. 30. Kernel <ul><li>- Executa no dispositivo N vezes em N threads em paralelo </li></ul><ul><li>Threads são organizadas em blocos </li></ul><ul><li>1D, 2D ou 3D </li></ul><ul><li>Cada thread de um bloco tem um índice </li></ul><ul><li>Blocos são organizados em grids (1D ou 2D) </li></ul><ul><li>- Cada bloco tem um índice </li></ul><ul><li>- Os blocos de um grid têm o mesmo número de threads </li></ul>
  31. 31. Threads, Blocos e Grids Exemplo: kernel executando em 72 threads Grid 2D com: Dimensão 3×2×1 6 blocos Blocos 2D com: Dimensão 4×3×1 12 threads cada
  32. 32. Warps, Threads, Blocos & Processadores <ul><li>512 threads - Bloco </li></ul><ul><li>8 thread blocos por SM </li></ul><ul><li>Total de 768 threads por SM </li></ul><ul><li>32 thread por Warp </li></ul><ul><li>shared cache: 16,384 bytes por SM </li></ul><ul><li>8,192 registers por SM </li></ul>
  33. 33. Execução Paralela
  34. 34. Diretivas (em C) <ul><li>Um kernel = _global__ </li></ul><ul><li>Kernels podem invocar outras funções que: </li></ul><ul><li>São especificadas como __device__ </li></ul><ul><li>Funções que executam no device: </li></ul><ul><li>- Não admitem número variável de argumentos </li></ul><ul><li>- Não admitem variáveis estáticas </li></ul><ul><li>- Não admitem recursão </li></ul><ul><li>Não admitem variáveis do tipo endereço de função </li></ul>
  35. 35. Fortran <ul><li>Attributes </li></ul><ul><ul><li>Global – Kernel executa na GPU </li></ul></ul><ul><ul><li>Device – rotinas que executam na GPU </li></ul></ul><ul><ul><li>Host – Executa na CPU </li></ul></ul><ul><li>Variaveis </li></ul><ul><ul><li>Device na memoria global da GPU </li></ul></ul><ul><ul><li>Constant na memoria de constante da GPU </li></ul></ul><ul><ul><li>Shared na memoria compartilhada </li></ul></ul>
  36. 36. Variaveis <ul><li>HOST </li></ul><ul><ul><li>CPU </li></ul></ul><ul><li>DEVICE </li></ul><ul><ul><li>GPU </li></ul></ul><ul><ul><li>Vários tipos de memoria </li></ul></ul><ul><ul><li>Vetores indexados pelo Thread </li></ul></ul><ul><li>Transferencia CPU ↔ GPU </li></ul><ul><li>Execução </li></ul><ul><li>Transferencia CPU ↔ GPU </li></ul>
  37. 37. Fortran <ul><li>Definição vetores memória global GPU </li></ul><ul><ul><li>real :: a(100) </li></ul></ul><ul><ul><li>attributes( device ) :: a </li></ul></ul><ul><ul><li>Real, device :: b(100) </li></ul></ul><ul><li>Definição vetores memória compartilhada GPU </li></ul><ul><ul><li>real :: a(100) </li></ul></ul><ul><ul><li>attributes(shared) :: a </li></ul></ul><ul><ul><li>Real, shared :: b(100) </li></ul></ul>
  38. 38. Transferencia dados em fortran <ul><li>a, b e c na CPU </li></ul><ul><li>Adev na GPU </li></ul><ul><ul><li>a = adev </li></ul></ul><ul><ul><li>adev = a </li></ul></ul><ul><ul><li>b = a + adev </li></ul></ul><ul><ul><li>c = x * adev + b </li></ul></ul>
  39. 39. Programa básico em C para CUDA <ul><li>Seleção do dispositivo a ser usado cudaSetDevice() </li></ul><ul><li>Alocação de memória no dispositivo cudaMalloc() </li></ul><ul><li>Transferência de dados entre host e dispositivo cudaMemcpy() </li></ul><ul><li>Liberação de memória no dispositivo cudaFree() </li></ul><ul><li>Finalização cudaThreadExit() </li></ul>
  40. 40. Média em Paralelo
  41. 41. Arranjo de multiprocessadores (SMs) <ul><li>Cada SM = 8 processadores (Sps), 1 unidade de instrução, Memória compartilhada </li></ul><ul><li>Cada SM: </li></ul><ul><li>Executa threads de um bloco em grupos de 32: warp </li></ul><ul><li>Implementa barreira de sincronização: __ syncthreads() </li></ul><ul><li>Emprega arquitetura SIMT: Single Instruction Multiple Thread </li></ul>
  42. 42. Arranjo de multiprocessadores (SMs)
  43. 43. Warps e Threads <ul><li>Os Threads de cada bloco são executados em pacotes </li></ul><ul><li>Os pacotes são os WARP que tem 32 threads cada (Nvidia GTX 200) </li></ul><ul><li>Se um bloco tem 100 threads </li></ul><ul><ul><li>Executa 32, depois 32, depois 32, depois 4. </li></ul></ul><ul><li>Desvio </li></ul><ul><ul><li>If (x > Lim ) calcula(x,y) </li></ul></ul><ul><ul><li>else acabou </li></ul></ul>
  44. 44. Modelo de Memória <ul><li>Memória compartilhada do bloco da thread </li></ul><ul><li>Visível para todas as threads do bloco </li></ul><ul><li>Tempo de vida do bloco </li></ul><ul><li>Memória local da thread </li></ul><ul><li>Memória global </li></ul><ul><li>Memória constante </li></ul><ul><li>Memória de textura </li></ul>
  45. 45. Acessos Paralelos a Memória
  46. 46. Memória Compartilhada - Mesmo bloco e 16Kb - Acesso 400 a 600 mais rápido que memória global Permite colaboração entre threads (do bloco) - Cada thread do bloco transfere dados da memória global para memória compartilhada Após a transferência __syncthreads() - Kernel efetua operações usando os dados da memória compartilhada: -Cada thread do bloco transfere dados da memória compartilhada para memória global
  47. 47. Codigo de Multiplicacao Matrizes ! start the module containing the matmul kernel module mmul_mod use cudafor contains ! mmul_kernel computes A*B into C where ! A is NxM, B is MxL, C is then NxL attributes(global) subroutine mmul_kernel ( A, B, C, N, M, L ) real :: A(N,M), B(M,L), C(N,L) integer, value :: N, M, L integer :: i, j, kb, k, tx, ty ! submatrices stored in shared memory real, shared :: Asub(16,16), Bsub(16,16) ! the value of C(i,j) being computed real :: Cij
  48. 48. continua... ! Get the thread indices tx = threadidx%x ty = threadidx%y ! This thread computes C(i,j) = sum(A(i,:) * B(:,j)) i = (blockidx%x-1) * 16 + tx j = (blockidx%y-1) * 16 + ty Cij = 0.0 ! Do the k loop in chunks of 16, the block size do kb = 1, M, 16 ! Fill the submatrices ! Each of the 16x16 threads in the thread block ! loads one element of Asub and Bsub Asub(tx,ty) = A(i,kb+ty-1) Bsub(tx,ty) = B(kb+tx-1,j) ! Wait until all elements are filled call syncthreads()
  49. 49. continua.... Multiply the two submatrices ! Each of the 16x16 threads accumulates the ! dot product for its element of C(i,j) do k = 1,16 Cij = Cij + Asub(tx,k) * Bsub(k,ty) enddo ! Synchronize to make sure all threads are done ! reading the submatrices before overwriting them ! in the next iteration of the kb loop call syncthreads() enddo ! Each of the 16x16 threads stores its element ! to the global C array C(i,j) = Cij end subroutine mmul_kernel
  50. 50. Na CPU.... ! The host routine to drive the matrix multiplication subroutine mmul( A, B, C ) real, dimension(:,:) :: A, B, C ! allocatable device arrays real, device, allocatable, dimension(:,:) :: Adev, Bdev,Cdev ! dim3 variables to define the grid and block shapes type(dim3) :: dimGrid, dimBlock ! Get the array sizes N = size( A, 1 ) M = size( A, 2 ) L = size( B, 2 ) ! Allocate the device arrays allocate( Adev(N,M), Bdev(M,L), Cdev(N,L) )
  51. 51. Continua.... ! Copy A and B to the device Adev = A(1:N,1:M) Bdev(:,:) = B(1:M,1:L) ! Create the grid and block dimensions dimGrid = dim3( N/16, M/16, 1 ) dimBlock = dim3( 16, 16, 1 ) call mmul_kernel<<<dimGrid,dimBlock>>> ( Adev, Bdev, Cdev, N, M, L ) ! Copy the results back and free up memory C(1:N,1:L) = Cdev deallocate ( Adev, Bdev, Cdev ) end subroutine mmul end module mmul_mod
  52. 52. Dicas <ul><li>Estratégias básicas </li></ul><ul><li>Maximização da execução em paralelo </li></ul><ul><li>- Estruturação do algoritmo </li></ul><ul><li>- Número de threads por bloco múltiplo do tamanho do warp </li></ul><ul><li>- Mínimo de 64 threads por bloco </li></ul><ul><li>Evitar divergência dentro do mesmo warp (desvios) </li></ul><ul><li>Otimização do uso de memória </li></ul><ul><li>Minimização de transferência de dados host/dispositivo </li></ul><ul><li>Uso de mem. compartilhada </li></ul><ul><li>Acesso sem conflitos de bancos à mem. compartilhada </li></ul>
  53. 53. Fermi <ul><li>512 CUDA cores </li></ul><ul><li>32 Cores/SM </li></ul><ul><li>16 SM </li></ul><ul><li>4x more core/SM than GT200 </li></ul>
  54. 54. 2 warps por SM <ul><li>Cada SM tem </li></ul><ul><li>2 warp </li></ul><ul><li>Exceto: Double Precision </li></ul>Warp Scheduler Warp Scheduler Inst Dispatch Unit Inst Dispatch Unit … … Warp 8 inst 11 Warp 9 inst 11 Warp 2 inst 42 Warp 3 inst 33 Warp 14 inst 95 Warp 15 inst 95 : : Warp 8 inst 12 Warp 9 inst 12 Warp 14 inst 96 Warp 3 inst 34 Warp 2 inst 43 Warp 15 inst 96
  55. 55. Dupla Precisão <ul><li>Full IEEE 754-2008 </li></ul><ul><li>16 precisão dupla FloatMultAdd ops/SM </li></ul><ul><li>8x pico sobre a GT200 </li></ul><ul><li>4 Unidades (SFU)s/SM </li></ul><ul><li>sin, cos e raiz </li></ul>
  56. 56. Cache <ul><li>64 KB on-chip configurable memory/SM </li></ul><ul><li>16 KB L1 cache + 48 KB Shared memory </li></ul><ul><li>48 KB L1 cache + 16 KB Shared memory </li></ul><ul><li>3x more Shared memory </li></ul><ul><li>Unified L2 </li></ul>

×