Hierarquia de memória:

Documentos relacionados
Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

Introdução a CUDA. Esteban Walter Gonzalez Clua. Medialab - Instituto de Computação Universidade Federal Fluminense NVIDIA CUDA Research Center START

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

INE5645-Programação Paralela e Distribuída Aula 17/09/2018 Nome

MC4: Introdução à Programação Paralela em GPU para a Implementação de Métodos Numéricos

Aplicações em CUDA. Medialab Instituto de Computação Universidade Federal Fluminense NVIDIA CUDA Research Center

Computação Paralela (CUDA)

Introdução ao CUDA. Material elaborado por Davi Conte.

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 13/11/2017 ALUNO

Técnicas de Processamento Paralelo na Geração do Fractal de Mandelbrot

Alocação Dinâmica em C

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2012/2013

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Introdução à Programação de GPUs

Eng. Thársis T. P. Souza

Alocação Dinâmica. Introdução à Computação

Tópicos em Física Computacional: Introdução a Linguagem CUDA

TEMA DE CAPA. Introdução à Programação em CUDA

Arquitetura e Programação de GPU. Leandro Zanotto RA: Anselmo Ferreira RA: Marcelo Matsumoto RA:

Fabrício Gomes Vilasbôas

Patrício Domingues Dep. Eng. Informática ESTG Instituto Politécnico de Leiria Leiria, Maio Programação Genérica de GPUs

5 Unidades de Processamento Gráfico GPUs

Técnicas de Nuvens de Pontos para Aplicações de Realidade Virtual e Aumentada

Paralelização do Detector de Bordas Canny para a Biblioteca ITK usando CUDA

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Conversão de algoritmos de processamento e análise de dados atmosféricos da linguagem C para CUDA

Paralelização de Aplicações para Realidade Aumentada em CUDA e OpenCL

MINI-CURSO: Introdução à Programação em CUDA

Uma introdução para computação paralela de modelos massivos. Adriano Brito Pereira inf.puc-rio.br

Waldemar Celes. 25 de Agosto de 2014

Processamento de Alto Desempenho utilizando Unidade de Processamento Gráfico - GPU

Arquiteturas de Computadores

Comparação de eficiência entre OpenCL e CUDA

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Modulo 12: alocação dinâmica de memória

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Entrada/Saída. Capítulo 5. Sistemas Operacionais João Bosco Junior -

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Introdução à Programação Aula 09. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Introdução a Ponteiros e Vetores em C

Paralelismo de dados. (execução de simultaneidade) Tipo de arquitetura paralela SIMD. SIMD (Single Instruction Multiple Data)

Point Based Graphics e Aplicações em Jogos

Sistemas Operacionais. BSI / UAB 2013 Hélio Crestana Guardia

Programação de Computadores II. Cap. 5 Vetores

Ponteiros. Introdução

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

Módulo 5 Vetores e Alocação Dinâmica

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Linguagem C: Ponteiros - Alocação Dinâmica

Ponteiros. Introdução e Alocação Dinâmica

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

MC-102 Aula 21 Registros

Processamento Paralelo Utilizando GPU

Linguagem C Ponteiros

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Sistemas Operacionais. Sistema de entrada e Saída

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Reinaldo Gomes Alocação Dinâmica

3. Linguagem de Programação C

Aula 10 - Streams (Parte I)

ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10. A linguagem C/C++ possui recursos para alocação dinâmica de memoria.

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Introdução OpenMP. Nielsen Castelo Damasceno

DAS5102 Fundamentos da Estrutura da Informação

Universidade Federal do Pampa Matheus da Silva Serpa. Análise de Desempenho de Aplicações Paralelas em Arquiteturas multi-core e many-core

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

3. Linguagem de Programação C

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Thársis T. P. Souza

Programação II. Aula 1

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

MC4: Introdução à Programação Paralela em GPU para a Implementação de Métodos Numéricos

Ponteiros de Variáveis

SCC Capítulo 2 Recursão

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Programação. Cap. 12 Gestão de Memória Dinâmica

Curso de Programação C em Ambientes Linux Aula 05

Exercícios Capítulos 5 e 6

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Modularidade - Funções e Procedimentos

Estrutura de dados 1. Ponteiros

Ponteiros. prof. Fabrício Olivetti de França

Hands-on CUDA. Prof. Esteban Walter Gonzalez Clua, Dr. Cuda Fellow Computer Science Department Universidade Federal Fluminense Brazil

Estruturas dinâmicas Ponteiros

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Nível da Arquitetura do Conjunto das Instruções

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017. ALUNO Prof. Bosco

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

O que é um apontador em C (type pointer in C)?

1 Exercícios com ponteiros

Introdução à Programação

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Programação de Computadores I. Ponteiros

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Transcrição:

INE5645 Programação Paralela e Distribuída Aluno Modelo de Execução CUDA - A execução do programa controlado pela CPU pode lançar kernels, que são trechos de código executados em paralelo por múltiplas threads na GPU. A execução de programas CUDA é composta por ciclos: CPU, GPU, CPU, GPU,, CPU, GPU, CPU. Hierarquia de memória:

Cada execução do kernel é composta, numa visão geral: Grid blocos threads Hierarquia de memória: - Registradores por thread. - Memória compartilhada por bloco. - Memória Global acessível a todas as threads. Exemplo Simples Neste primeiro exemplo iremos aprender como criar um (kernel) simples, que realiza a soma de 2 vetores. Veremos as principais operações usadas em CUDA: (1) Alocação de (memória). (3) Transferência de (dados). (4) Lançamento do (kernel). (2) Liberação de (memória). O código abaixo contém erros e limitações.

// Device code global void VecAdd(float* A, float* B, float* C, int n) { } int i = threadidx.x; if (i < n) C[i] = A[i] + B[i]; A primeira coisa a notar é a palavrachave global significa a construção de um em CUDA. Isso simplesmente indica que essa função pode ser chamada do Host ou do dispositivo CUDA. A próxima coisa que você deve notar é como cada thread ( ) descobre exatamente qual elemento de dados é responsável pela computação. Cada thread executa o mesmo código, portanto, a única maneira de se diferenciar threads é usar o threadidx ( ) e o blockidx ( ).

O valor de threadidx.x e blockidx.x devolve o e o bloco ao qual a thread pertence. // Host code // h significa host, enquanto d significa device) int main() { int n = 5; size_t size = n * sizeof(float); float *d_a, *d_b, *d_c; // "void*" é um ponteiro para algo. Mas cudamalloc() precisa modificar o ponteiro dado (o próprio ponteiro, não para o qual o ponteiro aponta), então você precisa passar "void **" que é um ponteiro para o ponteiro (geralmente um ponteiro para a variável local que aponta para o endereço de memória) tal que cudamalloc() pode modificar o valor do ponteiro. cudamalloc((void**)&d_a, size); cudamalloc((void**)&d_b, size); cudamalloc((void**)&d_c, size);

// Entrada de dados dos vetores A e B via Host. float h_a[] = {1,2,3,4,5}; float h_b[] = {10,20,30,40,50}; float h_c[] = {0,0,0,0,0}; // Copia os vetores A e B do Host para o Device. cudamemcpy(d_a, h_a, size, cudamemcpyhosttodevice); cudamemcpy(d_b, h_b, size, cudamemcpyhosttodevice); // Define o número de threads por bloco. int nthreadsperblock = 256 (múltiplo de 32); int nblocks = n/nthreadsperblock;???? // Chamada do kernel. VecAdd<<<nBlocks, nthreadsperblock>>>(d_a, d_b, d_c); // Copia o vetor C da memória da GPU para a memória no HOST. cudamemcpy(h_c, d_c, size, cudamemcpydevicetohost);

// Libera memória ocupada pelos vetores. cudafree(d_a); cudafree(d_b); cudafree(d_c); } Organizando Threads Uma parte crítica do projeto de aplicativos CUDA é organizar threads, blocos de threads e grids de forma apropriada. Para este aplicativo, a escolha mais simples é fazer com que cada thread calcule um elemento (uma entrada), e apenas uma thread, no array do resultado final. Uma orientação geral é que um bloco deve consistir em pelo menos 192 threads para ocultar a latência do acesso à memória (Tempo de latência, é o tempo que ela demora para entregar os dados... são os tempos de espera para troca de dados... sendo assim, quanto menor o tempo para a entrega, mais rápido fica). Portanto, 256 e 512 threads são números comuns e práticos. Para os propósitos deste exemplo, são selecionadas 256 threads por bloco. Se nós temos n elementos de dados, nós necessitamos somente n threads, no sentido de computar a soma dos vetores...

Assim, necessitamos o menor múltiplo de threadsperblock que é maior ou igual a n, por computar: (n + (threadsperblock-1))/threadsperblock Assim, o número de blocos lançados nblocks deve ser 32 ou (n + (threadsperblock - 1))/threadsPerBlock. https://books.google.com.br/books?id=... Para compilar o código, basta utilizar o comando: nvcc -o ex1 ex1.cu Perguntas: 1) O programa funciona corretamente? Teste seu funcionamento imprimindo o resultado obtido. 2) Corrija o programa. 3) Aumente o tamanho dos vetores para, por exemplo, 1024. Teste o resultado e, se não for o esperado, corrija o programa. Obs: Você deve manter o número de threads por bloco em 256. Referências: https://eradsp2010.files.wordpress.com/2010/10/curso2_cuda_cama rgo.pdf https://en.wikipedia.org/wiki/cuda http://supercomputingblog.com/cuda/cuda-tutorial-2-the-kernel/