SlideShare una empresa de Scribd logo
1 de 30
Multiplicação de Matrizes em CUDA Divino César SoaresPontifícia Universidade Católica de Goiás (CMP/PUC-GO)
O Problema ,[object Object]
 Gerar uma matriz resultado C com as mesmas dimensões das matrizes A e B.
 Cada elemento (i, j) da matriz C é o produto (interno) da linha i de A pela coluna j de B.
 Para cada elemento (i, j) de C:for (k=1; k<=LARGURA; k++) 	C[i][j] += (A[i][k] * B[k][j]);
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 1 	k = 1 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 1 	k = 2 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 1 	k = 3 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 1 	k = 4 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 2 	k = 1 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 2 	k = 2 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 2 	k = 3 4 1 2 3
Implementação Sequencial void multiplica(int *A[], int *B[], int *C[]) { for (int i=1; i<=LARGURA; i++) { for (int j=1; j<=LARGURA; j++) { for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } } } 1 2 3 4 ,[object Object],L = 4 	i  = 1 	j  = 2 	k = 4 4 1 2 3
Estrutura da Solução Alocar memória na GPU. Copia dados de entrada. Da CPU para a GPU. Configura execução. Número de threads e blocos. Copia resultados.  cudaMalloc((void **)&A_d, size_A); cudaMalloc((void**)&B_d, size_B); cudaMalloc((void**)&C_d, size_C); cudaMemcpy(A_d, A, size_A, cudaMemcpyHostToDevice); cudaMemcpy(B_d, B, size_B , cudaMemcpyHostToDevice); cudaMemcpy(C_d, C, size_C , cudaMemcpyHostToDevice); dim3 gride(X, Y)dim3 bloco(Z, W, K)meu_kernel<<<gride, bloco>>>(A, B, C); cudaMemcpy(C, C_d, size_C , cudaMemcpyDeviceToHost);
Primeira Abordagem
Kernel 1 dim3 gride(1, 1) dim3 bloco(4, 4, 1) dim3 gride(2, 1) dim3 bloco(4, 4, 1) dim3 gride(1, 1) dim3 bloco(30, 30, 1) Gride Gride Gride << Launcherror >>> Bloco com 600 threads Bloco 0 Bloco 0 Bloco 1
Kernel 1 dim3 gride(1, 1) dim3 bloco(LARGURA, LARGURA, 1) Gride LARGURA LARGURA Bloco 0
Kernel 1 dim3 gride(1, 1) dim3 bloco(LARGURA, LARGURA, 1) Gride __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } LARGURA LARGURA Bloco 0 Kernel 1: Multiplicação na GPU
Kernel 1 1 Instante de tempo t=0 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
Kernel 1 1 Instante de tempo t=1 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
Kernel 1 1 Instante de tempo t=2 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
Kernel 1 1 Instante de tempo t=L 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
Vantagens/Desvantagens ,[object Object],cada elemento de C é calculado em paralelo.  ,[object Object],Restrição do formato das matrizes. Elas devem ser quadradas.  Restrição da quantidade de elementos em cada matriz. Menor que 512.  Usa apenas a memória global da GPU. A memória global apresenta grande latência.  Apenas um bloco de threads, com poucas threads. Tamanho do maior bloco 22 x 22.  Os mesmos dados são buscados várias vezes da memória.  Resultado: Subutilização dos recursos da GPU.
Segunda Abordagem
Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) dim3 gride(1, 1) dim3 bloco(30, 30, 1) Gride Gride << Launcherror >>> Bloco com 600 threads Bloco 0, 0 Bloco 0, 1 Bloco 1, 0 Bloco 1, 1
Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) Gride Bloco 0, 0 Bloco 0, 1 225 threads por bloco.Total de 900 threads. Bloco 1, 0 Bloco 1, 1
Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) Gride __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } Bloco 0, 0 Bloco 0, 1 Kernel 2: Multiplicação na GPU Bloco 1, 0 Bloco 1, 1
Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3

Más contenido relacionado

Destacado

Multiplicacao de matrizes
Multiplicacao de matrizesMultiplicacao de matrizes
Multiplicacao de matrizes
Glauber Cruz
 
Matriz curric. matematica e.médio 2010
Matriz curric. matematica  e.médio 2010Matriz curric. matematica  e.médio 2010
Matriz curric. matematica e.médio 2010
Creison
 
Planejamento Matrizes e determinantes
Planejamento Matrizes e determinantesPlanejamento Matrizes e determinantes
Planejamento Matrizes e determinantes
MarcieleEuzebio
 

Destacado (8)

Aula 09 08-2013
Aula 09 08-2013Aula 09 08-2013
Aula 09 08-2013
 
Multiplicação de matrizes
Multiplicação de matrizesMultiplicação de matrizes
Multiplicação de matrizes
 
II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cad...
II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cad...II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cad...
II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cad...
 
Multiplicação de Matrizes
Multiplicação de MatrizesMultiplicação de Matrizes
Multiplicação de Matrizes
 
Multiplicacao de matrizes
Multiplicacao de matrizesMultiplicacao de matrizes
Multiplicacao de matrizes
 
Matriz curric. matematica e.médio 2010
Matriz curric. matematica  e.médio 2010Matriz curric. matematica  e.médio 2010
Matriz curric. matematica e.médio 2010
 
Plano de aula: Aspectos Didático-pedagógicos da Matemática no Ensino Médio II
Plano de aula: Aspectos Didático-pedagógicos da Matemática no Ensino Médio IIPlano de aula: Aspectos Didático-pedagógicos da Matemática no Ensino Médio II
Plano de aula: Aspectos Didático-pedagógicos da Matemática no Ensino Médio II
 
Planejamento Matrizes e determinantes
Planejamento Matrizes e determinantesPlanejamento Matrizes e determinantes
Planejamento Matrizes e determinantes
 

Similar a Multiplicação de matrizes em cuda (6)

Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
 
Funções (exercícios)
Funções (exercícios)Funções (exercícios)
Funções (exercícios)
 
4 tur11
4 tur114 tur11
4 tur11
 
Aplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic SortAplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic Sort
 
Lista 1 - Robótica (Jim & Ronie)
Lista 1 - Robótica (Jim & Ronie)Lista 1 - Robótica (Jim & Ronie)
Lista 1 - Robótica (Jim & Ronie)
 
Gabarito funcoes
Gabarito funcoesGabarito funcoes
Gabarito funcoes
 

Último

ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 
Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemática
sh5kpmr7w7
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
azulassessoria9
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
azulassessoria9
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
azulassessoria9
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
rfmbrandao
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
azulassessoria9
 

Último (20)

apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
 
O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemática
 
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União Europeia
 
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM POLÍGON...
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM  POLÍGON...Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM  POLÍGON...
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM POLÍGON...
 
Caderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdfCaderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdf
 
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptxMonoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
 
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
 
Questões de Língua Portuguesa - gincana da LP
Questões de Língua Portuguesa - gincana da LPQuestões de Língua Portuguesa - gincana da LP
Questões de Língua Portuguesa - gincana da LP
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdfMESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
 
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
 

Multiplicação de matrizes em cuda

  • 1. Multiplicação de Matrizes em CUDA Divino César SoaresPontifícia Universidade Católica de Goiás (CMP/PUC-GO)
  • 2.
  • 3. Gerar uma matriz resultado C com as mesmas dimensões das matrizes A e B.
  • 4. Cada elemento (i, j) da matriz C é o produto (interno) da linha i de A pela coluna j de B.
  • 5. Para cada elemento (i, j) de C:for (k=1; k<=LARGURA; k++) C[i][j] += (A[i][k] * B[k][j]);
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14. Estrutura da Solução Alocar memória na GPU. Copia dados de entrada. Da CPU para a GPU. Configura execução. Número de threads e blocos. Copia resultados. cudaMalloc((void **)&A_d, size_A); cudaMalloc((void**)&B_d, size_B); cudaMalloc((void**)&C_d, size_C); cudaMemcpy(A_d, A, size_A, cudaMemcpyHostToDevice); cudaMemcpy(B_d, B, size_B , cudaMemcpyHostToDevice); cudaMemcpy(C_d, C, size_C , cudaMemcpyHostToDevice); dim3 gride(X, Y)dim3 bloco(Z, W, K)meu_kernel<<<gride, bloco>>>(A, B, C); cudaMemcpy(C, C_d, size_C , cudaMemcpyDeviceToHost);
  • 16. Kernel 1 dim3 gride(1, 1) dim3 bloco(4, 4, 1) dim3 gride(2, 1) dim3 bloco(4, 4, 1) dim3 gride(1, 1) dim3 bloco(30, 30, 1) Gride Gride Gride << Launcherror >>> Bloco com 600 threads Bloco 0 Bloco 0 Bloco 1
  • 17. Kernel 1 dim3 gride(1, 1) dim3 bloco(LARGURA, LARGURA, 1) Gride LARGURA LARGURA Bloco 0
  • 18. Kernel 1 dim3 gride(1, 1) dim3 bloco(LARGURA, LARGURA, 1) Gride __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } LARGURA LARGURA Bloco 0 Kernel 1: Multiplicação na GPU
  • 19. Kernel 1 1 Instante de tempo t=0 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
  • 20. Kernel 1 1 Instante de tempo t=1 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
  • 21. Kernel 1 1 Instante de tempo t=2 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
  • 22. Kernel 1 1 Instante de tempo t=L 2 __global__voidmulGpu(int *A[], int *B[], int *C[]) { int i = threadIdx.x; int j = threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 1: Multiplicação na GPU 4 1 2 3
  • 23.
  • 25. Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) dim3 gride(1, 1) dim3 bloco(30, 30, 1) Gride Gride << Launcherror >>> Bloco com 600 threads Bloco 0, 0 Bloco 0, 1 Bloco 1, 0 Bloco 1, 1
  • 26. Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) Gride Bloco 0, 0 Bloco 0, 1 225 threads por bloco.Total de 900 threads. Bloco 1, 0 Bloco 1, 1
  • 27. Kernel 2 dim3 gride(2, 2) dim3 bloco(15, 15, 1) Gride __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } Bloco 0, 0 Bloco 0, 1 Kernel 2: Multiplicação na GPU Bloco 1, 0 Bloco 1, 1
  • 28. Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
  • 29. Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
  • 30. Kernel 2 1 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
  • 31. Kernel 2 1 Instante de tempo t=L 2 __global__void mulGpu2(int *A[], int *B[], int *C[]) { int i = blockIdx.x * SUB_LARGURA + threadIdx.x; int j = blockIdx.y * SUB_LARGURA + threadIdx.y; for (int k=1; k<=LARGURA; k++) { C[i][j] += (A[i][k] * B[k][j]); } } 3 4 Kernel 2: Multiplicação na GPU 4 1 2 3
  • 32.