SlideShare uma empresa Scribd logo
1 de 56
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]
Sumário ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
1. Arquitetura de Computadores ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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 !!!
1.2 Escalares x = y * w z = x + 3 Sub-utilização dos recursos
1.3 Escalonamento ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Estático – Compilador Dinâmico – Processador (1963) Fortran 1957, C 1969
1.4 Memória ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],antes depois
1.5 Cache Tempo = 1ns + falhas * 10ns = = 1ns + 2%  *  10ns =  1,2 ns !!!
Lei Amdahl ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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% desvios nos codigos.....
Computação Paralela ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Arquiteturas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
GPU Arquitetura, CUDA, Linguagens, Exemplos
CPU versus GPU ,[object Object],[object Object],ALU Cache Controle
Fermi – nova geração ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Aplicações ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Aplicações
CUDA (Compute Unified Device Architecture) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Escalável
História ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Cuda ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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, 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
Modelo de programação ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Kernel ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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
Warps, Threads, Blocos & Processadores ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Execução Paralela
Diretivas (em C) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fortran ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Variaveis ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fortran ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Transferencia dados em fortran ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Programa básico em C para CUDA ,[object Object],[object Object],[object Object],[object Object],[object Object]
Média em Paralelo
Arranjo de multiprocessadores (SMs) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Arranjo de multiprocessadores (SMs)
Warps e Threads ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Modelo de Memória ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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 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
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
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()
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
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) )
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
Dicas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fermi ,[object Object],[object Object],[object Object],[object Object]
2 warps por SM ,[object Object],[object Object],[object Object],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
Dupla Precisão ,[object Object],[object Object],[object Object],[object Object],[object Object]
Cache ,[object Object],[object Object],[object Object],[object Object],[object Object]

Mais conteúdo relacionado

Mais procurados

Introdução à programação embarcada
Introdução à programação embarcadaIntrodução à programação embarcada
Introdução à programação embarcadaRodrigo Almeida
 
Máquinas de turing com memória limitada
Máquinas de turing com memória limitadaMáquinas de turing com memória limitada
Máquinas de turing com memória limitadaCarlos Eduardo
 
Webinar: Uma introdução a ISA RISC-V e seu ecossistema
Webinar: Uma introdução a ISA RISC-V e seu ecossistemaWebinar: Uma introdução a ISA RISC-V e seu ecossistema
Webinar: Uma introdução a ISA RISC-V e seu ecossistemaEmbarcados
 
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Intel Software Brasil
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6Flávio Ribeiro
 

Mais procurados (8)

Introdução à programação embarcada
Introdução à programação embarcadaIntrodução à programação embarcada
Introdução à programação embarcada
 
Pro3 03 e_dados_complexos
Pro3 03 e_dados_complexosPro3 03 e_dados_complexos
Pro3 03 e_dados_complexos
 
Máquinas de turing com memória limitada
Máquinas de turing com memória limitadaMáquinas de turing com memória limitada
Máquinas de turing com memória limitada
 
R - D - DANIEL KAMINSKI DE SOUZA
R - D - DANIEL KAMINSKI DE SOUZAR - D - DANIEL KAMINSKI DE SOUZA
R - D - DANIEL KAMINSKI DE SOUZA
 
Webinar: Uma introdução a ISA RISC-V e seu ecossistema
Webinar: Uma introdução a ISA RISC-V e seu ecossistemaWebinar: Uma introdução a ISA RISC-V e seu ecossistema
Webinar: Uma introdução a ISA RISC-V e seu ecossistema
 
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
Palestra: Computação Paralela na SECOMP 2013 (UNIFEI)
 
Conhecendo o mundo da informática
Conhecendo o mundo da informáticaConhecendo o mundo da informática
Conhecendo o mundo da informática
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
 

Semelhante a GPU Introdução Processamento Alto Desempenho

Aplicando o poder de uma GPU no SQL Server
Aplicando o poder de uma GPU noSQL ServerAplicando o poder de uma GPU noSQL Server
Aplicando o poder de uma GPU no SQL Serverpichiliani
 
Python ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowPython ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowFabrício Vargas Matos
 
Apostila de montagem e manutenção de computadores emi mario gurgel
Apostila de montagem e manutenção de computadores emi mario gurgelApostila de montagem e manutenção de computadores emi mario gurgel
Apostila de montagem e manutenção de computadores emi mario gurgelPablo Mariano
 
Sistemas embarcados: motivação e primeiros passos
Sistemas embarcados: motivação e primeiros passosSistemas embarcados: motivação e primeiros passos
Sistemas embarcados: motivação e primeiros passosMarcelo Barros de Almeida
 
Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Intel Software Brasil
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaIntel Software Brasil
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesJoao Galdino Mello de Souza
 
Prova 2012 2_p4_gabarito
Prova 2012 2_p4_gabaritoProva 2012 2_p4_gabarito
Prova 2012 2_p4_gabaritoAmélia Moreira
 
slide arq H & S (1) (1).pdfslide arq H & S
slide arq H & S (1) (1).pdfslide arq H & Sslide arq H & S (1) (1).pdfslide arq H & S
slide arq H & S (1) (1).pdfslide arq H & SDenivalSouza1
 
Conceitos Básicos TRE RS 2015
Conceitos Básicos TRE RS 2015Conceitos Básicos TRE RS 2015
Conceitos Básicos TRE RS 2015Veonaprovalogo
 
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".Filipo Mór
 
Desempenho e Escalabilidade de Banco de Dados em ambiente x86
Desempenho e Escalabilidade de Banco de Dados em ambiente x86Desempenho e Escalabilidade de Banco de Dados em ambiente x86
Desempenho e Escalabilidade de Banco de Dados em ambiente x86Rodrigo Campos
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
arquitcomputeso-3-introducao-180323204952.pptx
arquitcomputeso-3-introducao-180323204952.pptxarquitcomputeso-3-introducao-180323204952.pptx
arquitcomputeso-3-introducao-180323204952.pptxCidrone
 
Amazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon Web Services LATAM
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 

Semelhante a GPU Introdução Processamento Alto Desempenho (20)

Aplicando o poder de uma GPU no SQL Server
Aplicando o poder de uma GPU noSQL ServerAplicando o poder de uma GPU noSQL Server
Aplicando o poder de uma GPU no SQL Server
 
Python ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao TensorflowPython ES 2017 - Introdução ao Tensorflow
Python ES 2017 - Introdução ao Tensorflow
 
Apostila de montagem e manutenção de computadores emi mario gurgel
Apostila de montagem e manutenção de computadores emi mario gurgelApostila de montagem e manutenção de computadores emi mario gurgel
Apostila de montagem e manutenção de computadores emi mario gurgel
 
Sistemas embarcados: motivação e primeiros passos
Sistemas embarcados: motivação e primeiros passosSistemas embarcados: motivação e primeiros passos
Sistemas embarcados: motivação e primeiros passos
 
Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralela
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno Domingues
 
Exercicios 06
Exercicios 06Exercicios 06
Exercicios 06
 
Prova 2012 2_p4_gabarito
Prova 2012 2_p4_gabaritoProva 2012 2_p4_gabarito
Prova 2012 2_p4_gabarito
 
Arq orgcom (1)
Arq orgcom (1)Arq orgcom (1)
Arq orgcom (1)
 
ArqOrgCom.ppt
ArqOrgCom.pptArqOrgCom.ppt
ArqOrgCom.ppt
 
Lista2009 2
Lista2009 2Lista2009 2
Lista2009 2
 
slide arq H & S (1) (1).pdfslide arq H & S
slide arq H & S (1) (1).pdfslide arq H & Sslide arq H & S (1) (1).pdfslide arq H & S
slide arq H & S (1) (1).pdfslide arq H & S
 
Conceitos Básicos TRE RS 2015
Conceitos Básicos TRE RS 2015Conceitos Básicos TRE RS 2015
Conceitos Básicos TRE RS 2015
 
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
 
Desempenho e Escalabilidade de Banco de Dados em ambiente x86
Desempenho e Escalabilidade de Banco de Dados em ambiente x86Desempenho e Escalabilidade de Banco de Dados em ambiente x86
Desempenho e Escalabilidade de Banco de Dados em ambiente x86
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
arquitcomputeso-3-introducao-180323204952.pptx
arquitcomputeso-3-introducao-180323204952.pptxarquitcomputeso-3-introducao-180323204952.pptx
arquitcomputeso-3-introducao-180323204952.pptx
 
Amazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenho
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 

GPU Introdução Processamento Alto Desempenho

  • 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.
  • 3.
  • 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. 1.2 Escalares x = y * w z = x + 3 Sub-utilização dos recursos
  • 6.
  • 7.
  • 8. 1.5 Cache Tempo = 1ns + falhas * 10ns = = 1ns + 2% * 10ns = 1,2 ns !!!
  • 9.
  • 10. Processadores ALU Controle Escalonamento Desvios Busca Memorias Caches
  • 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.
  • 13.
  • 14. GPU Arquitetura, CUDA, Linguagens, Exemplos
  • 15.
  • 16.
  • 17.
  • 19.
  • 21.
  • 22.
  • 23. Cuda em 1 Slide
  • 24. Cuda em 1 Slide
  • 25. Cálculo com Vetor – Versão CPU Suponha N muito grande, 10.000 elementos
  • 26. Thread, Blocos e Vetores Bloco = 2, Thread 3 Indice = (bloco – 1) * tamanho Bloco + thread = (2 – 1 ) * 4 + 3 = 7
  • 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.
  • 30.
  • 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.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 41.
  • 43.
  • 44.
  • 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. 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. 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. 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. 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. 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.
  • 53.
  • 54.
  • 55.
  • 56.