Programaчуo em Paralelo
Transcrição
Programaчуo em Paralelo
Programação em Paralelo CUDA N. Cardoso & P. Bicudo Física Computacional - MEFT 2012/2013 N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 1 / 19 CUDA "Compute Unified Device Architecture" Parte 1 N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 2 / 19 Outline 1 Poder Computacional dos GPUs 2 CPUs multicores X GPUs manycores 3 Arquitectura de um GPU com capacidades para CUDA 4 O que é o CUDA? 5 Instalação e Documentação do CUDA 6 Estrutura de um programa CUDA N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 3 / 19 Poder Computacional dos GPUs 17X 45X 100X 13–457x Motivation 110-240X 35X © 2008 NVIDIA Corporation N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 4 / 19 GPU’s Peak Computational Power Poder Computacional dos GPUs (GPU, Graphics Processing Unit) s ! " tu lmlv supercomputador mais rápido do mundo: Tianhe-1A, 2.507 petaflops (China) combina o poder de 7.168 GPUs NVIDIA Tesla M2050 e 14.336 CPUs multi-cores o mesmo desempenho apenas com CPUs: era necessário mais de 50 mil CPUs e consumiria mais de 12 megawatts de energia o Tianhe-1A consome apenas 4.04 megawatts. N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 5 / 19 CPUs multicores X GPUs manycores CPU GPU ALU ALU ALU ALU Control Cache ¬ jfi\§ ¬di\§ DRAM DRAM tp¡! ¢ a! " h£j¤ a' -! sq¥! " n£j¤¦§ ap%o!¨ a&( o ©&q( m`v¦ sq¥! " b !& ¢ \§ tp¡! ¢ a! " ª&,!, a' -! sq¥! " « j¦§ sqp%o! a&( o ©&q( m`v¦ sq¥! " « n\§ Diferentes objectivos produzem designs diferentes GPU assume que a carga de trabalho é altamente paralelizável CPU deve ser bom em tudo, paralelo ou não CPU: minimizar a latência experimentada por 1 thread grandes caches no processador lógica de controle GPU sofisticados Architecture (NVIDIA) GPU: maximizar a produção de todos os threads ®¯°±²³ # threads em uso é limitado pelos recursos → muitos recursos (registos, largura de ´°µ¶±··µ °·¸ Host banda, etc.) ¹º ¯µ »¼¼ Input Assembler multithreading pode esconder a latência → permite ignorar grandes caches Thread Execution Manager partilha da lógica de controlo através de muitos threads N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 6 / 19 CPUs multicores X GPUs manycores CPU multicore Optimizado para melhorar o desempenho de código sequencial Lógica de controle sofisticada para que instruções de um único thread executem em paralelo (ou fora da sua ordem sequencial) enquanto mantém a aparência de execução sequencial Memória cache grande para reduzir a latência de acesso aos dados e instruções das aplicações mais complexas (largura de banda de acesso à memória <20GB/s) Dificuldade de alterar o modelo de acesso à memória (para atender requisitos de sistemas operacionais e sistemas legados) N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 7 / 19 CPUs multicores X GPUs manycores GPU manycore Optimizado para execução de um número muito grande de threads Lógica de controle simplificada na execução de cada thread Memória cache pequena (apenas para ajudar nos requisitos de largura de banda i.e., threads acedendo os mesmos dados não precisam ir todos à DRAM) Largura de banda de acesso a DRAM 80GB/s, e para comunicação com o CPU 4GB/s (em cada direcção) O hardware aproveita o grande número de threads para encontrar trabalho para fazer quando parte dos threads estão esperando pela latência de acesso à memória Conceitos do CUDA: GPU - Device de computação com capacidade de executar threads em paralelo. CPU - Host que trabalha em conjunto com o GPU Kernel - instância do programa Thread - instância de um kernel Memória de vídeo / device Memória principal / host N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 8 / 19 GPU chip design Arquitectura de um GPU com capacidades para CUDA ‣ A glance at the GeForce 8800 ����� ���������� �������������� ���������������� ���������� ��������� ������������������������� �������������� ������ �������������� ������ �������������� ������ �������������� ������ �������������� ������ �������������� ������ �������������� ������ �������������� ������ �������� �������� �������� �������� �������� �������� �������� �������� �������� ����������� ����������� ����������� ����������� ����������� ����������� �������������� 16 N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 9 / 19 Arquitecturas de GPUs GPU G80 GT200 Fermi Transistors 681 million 1.4 billion 3.0 billion Cores CUDA 128 248 512 Precisão dupla None 30 FMA ops/clock 256 FMA ops/clock Precisão simples 128 MAD ops/clock 240 MAD ops/clock 512 MAD ops/clock Warp schedulers (por SM) 1 1 2 Shared memory (por SM) 16KB 16KB Configurável 48KB or 16KB Cache L1 (por SM) None None Configurável 16KB or 48KB Cache L2 (por SM) None None 768KB ECC memory support No No Yes Concurrent kernels No No Up to 16 Load/Store address width 32-bit 32-bit 64-bit SM: streaming multiprocessor E ainda a arquitectura Kepler 4 arquitecturas de GPUs com suporte para CUDA N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 10 / 19 O que é o CUDA? CUDA, Compute Unified Device Architecture É uma arquitetura paralela de propósito geral destinada a utilizar o poder computacional de GPUs NVIDIA Extensão da linguagem C, que permite o uso de GPUs: Suporte a uma hierarquia de grupos de threads Definição de kernels que são executados na GPU API com funções,CUDA que permite a memória Software gerir Development Kit da GPU e outros tipos de controle Optimized libraries: math.h, BLAS, FFT Integrated CPU and GPU source code CUDA C Compiler (nvcc) Machine independent assembly (PTX) CUDA Driver Debugger Profiler GPU N. Cardoso & P. Bicudo CPU Host Code Standard C compiler CPU Programação em Paralelo: CUDA 11 / 19 Instalação e Documentação do CUDA CUDA v4.2: Download: https://developer.nvidia.com/cuda-toolkit-42-archive CUDA/GPU driver Permite o acesso ao hardware Lista de GPUs suportados: https://developer.nvidia.com/cuda-gpus CUDA Toolkit Ferramentas e bibliotecas para programação em CUDA CUDA SDK Em Linux é necessário fazer make após a instalação Inclui vários exemplos de código N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 12 / 19 Instalação e Documentação do CUDA Instalação Driver, LINUX: C t r l + A l t +F2 K i l l the X server chmod +x d e v d r i v e r _ 4 . 2 _ l i n u x _ ∗ . run . / d e v d r i v e r _ 4 . 2 _ l i n u x _ ∗ . run reboot Exemplo, Fedora (root): init 3 chmod +x d e v d r i v e r _ 4 . 2 _ l i n u x _ ∗ . run . / d e v d r i v e r _ 4 . 2 _ l i n u x _ ∗ . run reboot editar o conteúdo do ficheiro /boot/grub2/grub.cfg. Procure a entrada do kernel mais recente e altera a linha semelhante à seguinte: l i n u x / boot / vmlinuz −3.6.2 −4. f c 1 7 . x86_64 r o o t = . . . r d .md=0 r d . lvm=0 r d .dm=0 SYSFONT=True KEYTABLE=pt−l a t i n 1 r d . l u k s =0 LANG=en_US . UTF−8 rhgb q u i e t adicione no final da linha: nouveau . modeset=0 r d . d r i v e r . b l a c k l i s t =nouveau Reinicie o PC. N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 13 / 19 Instalação e Documentação do CUDA Instalação do Toolkit, LINUX: Instale com permissões de root: chmod +x c u d a t o o l k i t _ 4 . 2 . 9 _ l i n u x _ ∗ . run . / c u d a t o o l k i t _ 4 . 2 . 9 _ l i n u x _ ∗ . run Por defeito a instalação será em: /usr/ local /cuda/ Adicione os seguintes PATH’s, por exemplo, a "/home/user/.bashrc" ou a " /.bash_profile": sistemas 32bits: PATH=$PATH : / u s r / l o c a l / cuda / b i n e x p o r t PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH : / u s r / l o c a l / cuda / l i b e x p o r t LD_LIBRARY_PATH sistemas 64bits: PATH=$PATH : / u s r / l o c a l / cuda / b i n e x p o r t PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH : / u s r / l o c a l / cuda / l i b 6 4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH : / u s r / l o c a l / cuda / l i b e x p o r t LD_LIBRARY_PATH Documentação extra: /usr/ local /cuda/doc/ N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 14 / 19 Instalação e Documentação do CUDA Instalação do SDK, LINUX: Instale com permissões de user: chmod +x gpucomputingsdk_4 . 2 . 9 _ l i n u x . run . / gpucomputingsdk_4 . 2 . 9 _ l i n u x . run Por defeito a instalação será em: /home/user/NVIDIA_GPU_Computing_SDK/ Depois da instalação do SDK: cd / home / user / NVIDIA_GPU_Computing_SDK / C / make O CUDA SDK também necessita para alguns códigos: Xi Xmu and glut. No caso do fedora, certifiquem-se que têm instalados os seguintes pacotes: f r e e g l u t −d e v e l l i b X i −d e v e l libXmu−d e v e l mesa−libGLU−d e v e l caso contrário executem cd / home / user / NVIDIA_GPU_Computing_SDK / C / make − i Caso obtenha erro por incompatibilidade da versão do gcc, é necessário instalar uma versão inferior do mesmo, por exemplo gcc 4.5. N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 15 / 19 Instalação e Documentação do CUDA CUDA SDK: Lista de códigos disponibilizados com o SDK em: / home / user / NVIDIA_GPU_Computing_SDK /C/ s r c / Coloquem os vossos projectos em: / home / user / NVIDIA_GPU_Computing_SDK /C/ s r c / Os binários dos projectos ficam em: / home / user / NVIDIA_GPU_Computing_SDK /C/ b i n / l i n u x / r e l e a s e / N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 16 / 19 Instalação e Documentação do CUDA Bibliografia: David B. Kirk, Wen-mei W. Hwu, Programming Massively Parallel Processors: A Hands-on Approach, Elsevier; Rob Farber, CUDA Application Design and Development, Elsevier; Jason Sanders, Edward Kandrot, CUDA by Example: An Introduction to General-Purpose GPU Programming; Documentação com CUDA Toolkit, incluido na instalação do Toolkit, /usr/local/cuda/doc/; Fórum da NVIDIA: https://devtalk.nvidia.com/ N. Cardoso & P. Bicudo Programação em Paralelo: CUDA 17 / 19 Estrutura de um programa CUDA Um programa CUDA consiste de uma ou mais fases que são executadas no host (CPU) ou em um device (GPU): as fases com pouco ou nenhum paralelismo de dados são executadas no host as fases com grande qtde de paralelismo de dados são executadas no device CUDA Software Development Kit Um programa CUDA é um código unificado que engloba o código do host e do device O compilador nvcc (NVIDIA C) separa as duas partes do código durante o processo de compilação nvcc -o name name.cu Optimized libraries: math.h, BLAS, FFT CUDA C Compiler (nvcc) Machine independent assembly (PTX) CUDA Driver Mais prático: Makefile N. Cardoso & P. Bicudo Integrated CPU and GPU source code Debugger Profiler GPU Programação em Paralelo: CUDA CPU Host Code Standard C compiler CPU Applied Mathematics 18 / 19 Avaliação de Desempenho ção Estrutura Concorrentede Assı́ncrona um programa Conclusão Referências CUDA e Interacção CPU-GPU How does it work? GPU: Corre o código paralelo (Kernel). gêneoCPU: de Computação d $a'oo ap%('(q& CPU Controla o GPU e disponibiliza dados para o mesmo r $`!( & GPU j$a%k l&%( m'(' PC Memory n $a%k `!o( GPU Memory ÄÅÆÇÈ Ë ÌÅÆ ÉÊ j$a%k l&%( m'(' d $a'oo Í!&!o bqp! r $`!( & n $a%k `!o( N. Cardoso & P. Bicudo Programação em Paralelo: CUDA α °Ï±Ð ÑÒ϶¯Óµ Ï 19 / 19
Documentos relacionados
MINI-CURSO: Introdução à Programação em CUDA
É uma arquitetura paralela de propósito geral destinada a utilizar o poder computacional de GPUs nVIDIA Extensão da linguagem C, que permite o uso de GPUs: - Suporte a uma hierarquia de grupos de t...
Leia maisO Padrão de Projeto Barracuda
emergentes, que demandam quantidades de recursos computacionais elevadas, tornam a Computação de Alto Desempenho indispensável. Exemplos de aplicações que demandam alto custo computacional estão pr...
Leia mais