Intel Thread Building Blocks (TBB)

Documentos relacionados
AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS

OpenMP: Variáveis de Ambiente

Aluno de Pós-Graduação em Engenharia de Software para Dispositivos Móveis pela UNINTER

Introdução OpenMP. Nielsen Castelo Damasceno

Paralelismo em Computadores com Tecnologia Multicore

Sistemas Distribuídos e Paralelos

Programação de Alto Desempenho - 2. Prof: Carla Osthoff

Sistemas Distribuídos Aula 3

COMPARAÇÃO DE DESEMPENHO ENTRE IMPLEMENTAÇÕES DO ALGORITMO JOGO DA VIDA COM PTHREAD E OPEMMP 1

UM ESTUDO COMPARATIVO DE DESEMPENHO UTILIZANDO PROGRAMAÇÃO SEQUENCIAL VS PARALELA APLICADO EM ALGORITMOS GENÉTICOS 1

Sistemas Operacionais

Sistemas Operacionais

Introdução ao OpenMP

Threads. MCTA Sistemas Operacionais. Emilio Francesquini 2019.Q1

Sistemas Operacionais

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

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Análise de Desempenho de Aplicações Paralelas do Padrão Pipeline em Processadores com Múltiplos Núcleos

Programação em Paralelo OpenMP

Linguagem C Princípios Básicos (parte 1)

ANÁLISE DE DESEMPENHO COM A PARALELIZAÇÃO DO CÁLCULO DE NÚMEROS PERFEITOS 1

ANHANGUERA ESTRUTURA DE DADOS AULA 02 O QUE É ESTRUTURA DE DADOS? Prof. Thomás da Costa

Ferramentas para Programação em Processadores Multi-Core

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

Sistemas Operacionais

Chapter 4: Threads. Operating System Concepts 8th Edition

Programação Concorrente e Paralela

Fundamentos de Sistemas Operacionais

Programação Estruturada

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

3. Linguagem de Programação C

Sistemas Operacionais Aula 07: Scheduling da CPU. Ezequiel R. Zorzal

Paradigmas de Processamento Paralelo na Resolução do Fractal de Mandelbrot

for(int x=0; x < width; x++) { for(int y=0; y < height; y++) { finalimage[x][y]=renderpixel(x,y, &scenedata); } }

Sistemas Operacionais

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula

SSC PROGRAMAÇÃO CONCORRENTE. Aula 06 Modelos de Programação Prof. Jó Ueyama e Julio Cezar Estrella

Paralelização de Algoritmos de CFD em Clusters Multi-Core MC7. Escola de Verão Arquiteturas Multi-Core

Medida de desempenho

Programação Paralela e Distribuída Lista de Exercícios P2 2008/1

TÍTULO: PROGRAMAÇÃO PARALELA - UMA INTRODUÇÃO AO PARALELISMO COM A OPENMPI

Programação Concorrente e Paralela. Noemi Rodriguez

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

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

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

Threads e Sincronização no Linux

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Introdução à OpenMP (Dia 1) Prof. Guido Araujo

XV ESCOLA REGIONAL DE ALTO DESEMPENHO ERAD 2015

BALANCEAMENTO DE CARGA EM SISTEMAS MULTIPROCESSADORES UTILIZANDO O MODELO DE PROGRAMAÇÃO CHARM++ 1

OpenMP. Slides baseados em tutorial de Tim Mattson da Intel

Linguagem de Programação

AULA Nº 08 SISTEMAS OPERACIONAIS. Threads

Variáveis em OpenMP. Esbel Tomás Valero Orellana

Construtores de Sicronização em OpenMP

Bibliografia. OpenMP. Disponibilidade de OpenMP. Abordagem SPMD. Nicolas Maillard

DESENVOLVIMENTO DE UM ALGORITMO PARALELO PARA APLICAÇÃO EM CLUSTER DE COMPUTADORES

Slide 01 16/03/2017. Estruturas de Dados. Prof. Cleziel Franzoni da /Cleziel.

OO Engenharia Eletrônica

SISTEMAS EMBARCADOS. Programação Concorrente e CMSIS RTOS. Prof. André Schneider de Oliveira

Programação Concorrente. Prof. Hugo Vieira Neto

Programação de Arquiteturas com Memória Compartilhada Utilizando Pthreads

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência

Computação Paralela e Distribuída. Heucles Jr

Template de classe. class vetor { int *arranjo; int limite; public: vetor(int=100); int & operator[ ](int n); };

Universidade Federal do Espírito Santo. Programação I Tipos de Dados Básicos - C Professora: Norminda Luiza

3. Linguagem de Programação C

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

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

Algoritmos e Programação

Programação de Sistemas em Tempo Real

Programação Estruturada

Material III-Bimestre Introdução e conceitos fundamentais da Linguagem C#

Programação Concorrente e Paralela. Noemi Rodriguez

Introdução aos Sistemas Operacionais. Threads

Programação científica C++

Universidade Federal de Ouro Preto

Curso de Programação Distribuída e Paralela 29/09/2008. Informática UFRGS. Sistemas Operacionais II (C. Geyer) Sincronização 1. Pg.

Aula 2: Tipos de Sistemas Operacionais. Instituto Federal da Bahia Campus Salvador INF009 - Sistemas Operacionais Profª Flávia Maristela

INE5645 PROGRAMAÇAO PARALELA E DISTRIBUÍDA PROVA 1 18/09/2017 ALUNO: Prof. Bosco

Física Computacional 15 Templates

Programação: Vetores

Análise de Desempenho da Paralelização do Problema de Caixeiro Viajante

Aplicação de um Modelo de Programação com Paradigma de Memória Compartilhada na Espacialização do Relevo utilizando Threading Building Blocks (TBB)

Treinamento Olimpíada Brasileira de Informática

Programação Concorrente e Paralela

Implementando uma demonstração

Threads. O que é uma Thread? Paralelismo

Computadores e Programação (DCC/UFRJ)

Exemplo de Arquitetura: Cliente/Servidor com Mestre e Escravos. Interface. Fator de speed-up. Speed-up

Ruby e JRuby em... Paralelos e Distribuídos. Felipe Barden Lucas Fialho Zawacki

EEL770 Sistemas Operacionais

Programação Paralela e Distribuída

Threads. Nuno Ferreira Neves Faculdade de Ciências de Universidade de Lisboa. Fernando Ramos, Nuno Neves, Sistemas Operativos,

INTRODUÇÃO AOS SISTEMAS OPERACIONAIS SEMANA 13

Leandro Soares de Sousa (DSc.) Página: Aula 04 - desenvolvimento multithread

INTRODUÇÃO À TECNOLOGIA DA INFORMAÇÃO PROCESSOS PROFESSOR CARLOS MUNIZ

Paradigmas de Programação

LabSO Gerência de Processos. Processos. Porque eu preciso entender este assunto?

Transcrição:

Intel Thread Building Blocks (TBB) MCZA020-13 - Programação Paralela Emilio Francesquini e.francesquini@ufabc.edu.br 2019.Q1 Centro de Matemática, Computação e Cognição Universidade Federal do ABC

Disclaimer Estes slides foram preparados para o curso de Programação Paralela na UFABC. Este material pode ser usado livremente desde que sejam mantidos, além deste aviso, os créditos aos autores e instituições. Estes slides foram fortemente baseados no material elaborado por Paul Guermonprez (Intel) e Jan Verschelde (University of Illinois at Chicago) 1

Introdução

Programação em processadores multi-core Já apresentamos: MPI: para programação paralela de computadores com memória distribuída Pthreads: para programação paralela de computadores com memória compartilhada em ambientes POSIX (Linux, FreeBSD, Mac OS X, ) OpenMP: para programação paralela de computadores com memória compartilhada 2

Programação em processadores multicore Intel Thread Building Blocks (TBB) é mais uma ferramenta na mesma linha: Programação paralela de processadores multicore em geral (pelo menos é a propaganda ) Suporte comercial para: Linux, Windows, Mac OS X Versão open source disponível para: FreeBSD, IA Solaris, XBox 360 3

Intel Threading Building Blocks Intel TBB é uma biblioteca que, na mesma linha de OpenMP, é voltada ao desenvolvimento de aplicações paralelas em máquinas multicore para não especialistas. O nível de programação é mais alto do que Pthreads puro Não exige suporte do compilador Baseado em generics (templates em C++) e a partir de C++11 também utilizando funções lambda Talvez a principal diferença entre os concorrentes é a de que o paralelismo é especificado logicamente, sem necessariamente pensarmos em termos de threads e é, portanto, mais voltado ao paralelismo de dados Fonte pode ser baixado em: 4

Programação baseada em tarefas Em lugar de dividir a carga de trabalho entre threads (como por exemplo OpenMP), a carga é dividida em tarefas (tasks). Tarefas são muito leves Iniciar e terminar uma tarefa leva em média 18 vezes menos tempo do que fazer o mesmo com um thread Por outro lado as tarefas precisam ser escalonadas pelo ambiente de execução (e não pelo SO) já que não tem uma entidade única correspondente no escalonador do SO 5

Diferenças entre escalonadores O escalonador do TBB utiliza roubo de trabalho (work-stealing) para efetuar o balanceamento de carga Quando escalonamos threads à processadores, podemos fazer a seguinte distinção: Compartilhamento de trabalho - O escalonador tenta migrar threads entre os processadores de modo a equilibrar a carga entre eles Roubo de trabalho - Processadores pouco utilizados roubam as tarefas diretamente dos outros processadores 6

Limitações TBB não é apropriado para Computações I/O bound Processamento real time Isso se deve ao fato do escalonador do TBB não ser justo (unfair). Em alguns casos essa característica permite algumas otimizações de desempenho que não seriam possíveis de outra maneira. 7

Usando o TBB

Programa de exemplo 1 2 3 4 using namespace 5 6 class say_hello 7 const char 8 public 9 const char 10 11 void operator const 12 \n 13 14 8

A função main 1 int 2 3 4 5 6 7 8 O método cria e executa a tarefa imediatamente Ele é não bloqueante, ou seja, o controle da execução retorna imediatamente Para esperar as tarefas utilizamos o método wait. Equivalente ao em Pthreads. Note o uso de um grupo de tarefas 9

Compilando Baixe o TBB da página oficial. Se estiver utilizando um Makefile, inclua as seguintes linhas: 10

Executando 11

O parallel_for

Potenciação de números complexos Considere o seguinte problema: Entrada: n Z >0, d Z >0, x C n Saída: y C n, y k = x d k, para k = 1, 2,..., n É preciso tomar cuidado para evitar overflows (aqui pegamos números no círculo unitário) Representamos os números complexos em C++ como uma template class Para criar um complexo com o tipo fazemos: 1 2 using namespace 3 typedef double 12

Código da potenciação 1 2 3 4 5 void Calculamos e 2πiθ = cos(2πθ) + i sin(2πθ) para valores aleatórios de θ [0, 1] 1 void 2 int 3 double double 4 double 5 6 return 7 13

Imprimindo os vetores 1 2 3 4 void int 5 for int 6 7 8 \n 9 Observe a declaração local de no laço. Também modificamos a saída para formato científico e utilizamos os métodos e 14

Computando as potẽncias 1 2 void int 3 int 4 for int 5 6 7 8 for int 9 10 11 12 O interno é deliberadamente lento (por exemplo não utiliza o método de elevar ao quadrado repetidamente) 15

Executando 1º parâmetro: n 2º parâmetro: d 3º parâmetro: verbose 16

Paralelizando o programa com parallel_for Para utilizarmos o é preciso criar uma classe Também é possível utilizar funções lambda para simplificar um pouco a implementação O particiona o range original e distribui os subranges aos trabalhadores de modo que: A carga seja balanceada Use as caches de maneira eficiente Escale bem em processadores com muitos cores 17

A classe ComputePowers 1 class ComputePowers 2 const 3 int 4 5 public 6 int 7 8 void operator 9 const size_t const 10 for size_t 11 12 for int 13 14 15 16 17 18

tbb/blocked_range.h 1 2 template typename class blocked_range Um representa um intervalo na forma [i, j) que pode ser dividido de maneira recursiva. 1 void const size_t const 2 for size_t 3 19

tbb/blocked_range.h A biblioteca já fornece alguns ranges:,, e Você pode definir o seu próprio implementando os métodos: 1 2 const 3 4 5 bool const 6 7 bool const 8 9 20

Como funciona o spllit blocked_range2d Split range..... recursively... tasks available to be scheduled to other threads (thieves)...until grainsize. 21

Chamando o parallel_for 1 2 3 4 5 using namespace É preciso modificar a chamada à função na função de: 1 Para: 1 2 size_t 3 22

Executando a versão paralela Speedup de 20.139 1.191 = 16.909 em uma máquina com dois processadores de 8 núcleos 23

Exemplo 2 - Código sequencial 1 const int 2 void float int 3 for int 4 5 6 7 int 8 float 9 10 11 return 12 24

Exemplo 2 - Código paralelo 1 class ChangeArrayBody 2 float 3 public 4 float 5 void operator const size_t const 6 for size_t 7 8 9 10 11 void float size_t 12 int 13 14 25

Exemplo 2 - Código usando lambdas 1 void float size_t 2 size_t 3 const size_t void 4 for size_t 5 6 7 26

Generic Programming vs. Funções Lambda Em termos de desempenho são equivalentes Nem sempre é possível utilizar funções lambda Funções lambda fazem parte do padrão C++11 Alguns compiladores podem exigir um parâmetro adicional para especificar a versão do C++ ( ) 27

parallel_reduce

Uma ótima aplicação de roubo de trabalho Fonte: Intel TBB Tutorial 28

E no caso de não haver nenhum trabalhador disponível? Fonte: Intel TBB Tutorial 29

A classe SumIntegers 1 class SumIntegers 2 int 3 public 4 int 5 int 6 void operator const size_t 7 int 8 int 9 size_t 10 for size_t 11 12 13 14 15 16 void const 17 18 19 30

Chamando a função 1 int int size_t 2 3 size_t 4 return 5 6 7 int int char 8 9 10 11 int 12 13 14 15 return 16 31

Outras funcionalidades

Algoritmos disponíveis no TBB 1/2 e : execução paralela de iterações de laços com balanceamento de carga automático. As iterações precisam ser independentes. : execução paralela de iterações de laços sem dependência onde é necessário efetuar uma redução (ex. soma de elementos distintos) com balanceamento de carga automático : execução paralela e balanceada da computação de prefixos paralelos : execução paralela através de um pipeline com a opção de uso de filtros sequenciais ou paralelos. 32

Algoritmos disponíveis no TBB 2/2 : execução paralela balanceada de iterações de laços sem dependência com a possibilidade de adicionar trabalho à fila durante a execução : auto-explicativo : execução paralela de function objects ou ponteiros para funções 33

Para saber mais

Para saber mais Página oficial: Repositório TBB: Intel Threading Building Blocks Tutorial - Parallel Programming with Intel Threading Building Blocks - 34