Sunteți pe pagina 1din 40

Programao Paralela e Concorrente

2 Quadrimestre / 2017

Aula 1
Introduo

Prof. Raphael Y. de Camargo


raphael.camargo@ufabc.edu.br
Parte I

Introduo Disciplina
Objetivos da Disciplina
Obter fluncia na programao paralela e concorrente,
permitindo o desenvolvimento de programas que utilizam
mltiplos processadores, computadores e GPUs
Aprendizado ser composto por:
- Aulas tericas (2h)
- Aulas de laboratrio (2h)
- Exerccios prticos
- Projeto
- Estudo individual
Aulas de laboratrio no L408-2 do bloco A, torre II
Programa Preliminar
Paralelizao de Programas
Programas multi-threaded
Sincronizao e comunicao entre threads
Modelos de programas paralelos
Programao com OpenMP e Pthreads

Programas para aglomerados (clusters)


Sincronizao e comunicao entre mquinas
Programao com MPI

Programao em GPUs
Arquitetura e programao de GPUs
Programao em CUDA
Conhecimentos Esperados
So esperados conhecimentos em:

Linguagem C: incluindo ponteiros

Estrutura de dados: listas ligadas, filas, ordenao, etc.

Conhecimentos em outras reas, como sistemas


operacionais, redes, grafos, etc., so teis, mas o
contedo necessrio ser passada durante o curso.
Presena
A presena nas aulas ser controlada
O aluno deve ter, no mnimo, 75% de frequncia
24 aulas mximo de 6 faltas
Alunos com mais faltas sero reprovados

Controle por lista de presena

Falsificao de assinatura ser considerado fraude

Parte I - Apresentao
Avaliaes
Listas:

Uma lista por semana, a ser entregue no incio das aulas de


segunda. Sero usadas para arredondar a mdia final.
Projeto (50%)

Ser 1 projeto (de duas partes) a ser desenvolvido em dupla

A presena na data indicada no cronograma para apresentao


do projeto obrigatria
Provas escritas (50%)

11 provinhas de 30 minutos. Sempre no incio das aulas de


segunda

Necessrio ter mdia no mnimo C nas provas para ser aprovado

No haver prova de recuperao


Cronograma
TERA QUARTA
06/fev 1 2
13/fev 3 4
20/fev 5 6
27/fev 7 8
06/mar 9 10
13/mar 11 12
20/mar 13 14
27/mar 15 16
03/abr 17 18
10/abr 19 20
17/abr 21 22
24/abr 23 Apresentao Projetos

8
Parte 1

Threads e memria compartilhada

Pthreads e OpenMP

Paralelizao de algoritmos

Sincronizao de threads

Modelos de Programao paralela

Uso de mltiplos computadores

Troca de Mensagens e MPI

GPUs e CUDA
Bibliografia
Ser cobrado o que for dado em aula, incluindo o contedo
de slides e documentos fornecidos, alm das explicaes
na lousa
Os slides so apenas uma referncia, no servindo como
material de estudo para a prova

Em cada tpico apresentado, sero apresentados sites ou


tutoriais onde informaes sobre os tpicos abordados
podem ser obtidas
Site da Disciplina
A disciplina ser disponibilizada atravs do TIDIA em:

http://tidia4.ufabc.edu.br

Todos os alunos devem obrigatoriamente se cadastrar no


site da disciplina:
ProgPar 2017.2 (ps)
Acessem regularmente seus e-mails a vocs, pois
comunicados importantes podem ser enviados
Linux
- Mais fcil de instalar e usar: Ubuntu
- Disponvel nos laboratrios didticos da UFABC

1) Executar a partir de pen-drive. Mais fcil, mas fica limitado pelo


tamanho do pendrive
http://www.techtudo.com.br/dicas-e-tutoriais/noticia/2016/12/como-criar-um-pendrive-
inicializavel-do-ubuntu-no-windows-e-no-linux.html

2) Criar uma partio no disco rgido e instalar o Linux

3) Usar mquina virtual (apenas se tiver um computador muito


bom)

12
Por que estudar Programao Paralela?
Computadores para Usurios Finais
Desempenho dos processadores historicamente dobrou a
cada 18 meses (Lei de Moore). Aumento em:
- Velocidade do relgio
- Nmero de transistores
Mas chegou-se ao limite
da miniaturizao
do transistor

SOLUO: Fonte: http://www.legitreviews.com

Produzir processadores multi-core


Lei de Moore

Fonte: en.wikipedia.org
CPUs com Mltiplos Ncleos
Aumentos de frequncia geram consumo maior e mais calor
Diminuio do tamanho de transistores est chegando no limite
Soluo utilizada atualmente para processadores
Ao invs de fazer processadores de 30GHz, utilizar 10 de 3GHz
Desempenho terico igual (mas na prtica no )
No incio, utilizados
em servidores de
alto-desempenho
Hoje, computador
pessoais possuem
processadores com
pelo menos 2 ncleos
CPUs com Mltiplos Ncleos
Vantagens
Maior velocidade sem aumento da frequncia do relgio
Menor consumo energtico e gerao de calor
Desvantagens
No caso de aplicaes isoladas, o processador com 2 ncleos
til apenas se a aplicao utilizar pelo menos 2 threads
Mais difcil de programar
Exemplo: Intel Core
Arquitetura modular
Permite a composio de diferentes tipos de processador
De notebook a servidores de alto desempenho
Suporte a hyperthreading at 16 threads simultneas
Memria Compartilhada
Processadores compartilham uma memria comum
Comunicao e sincronizao de tarefas feitos pela memria
Memria compartilhada modelo fcil de programar
Aglomerados (Clusters)
Construdos conectando um
conjunto de PCs convencionais
atravs de uma rede
Permitem obter um grande poder
computacional com um baixo custo

Mas a comunicao entre as


mquinas um grande gargalo
No muito eficiente para
aplicaes compostos por processos
que se comunicam frequentemente
Organizao de um Aglomerado
Cada processador possui sua memria privada
Tambm chamado de sistema de memria distribuda
Cada processador pode acessar somente sua memria
Comunicao feita atravs de troca de mensagens
Grficos 3D
Inicialmente gerados pela CPU
Em seguida, por mdulos de
funo fixa
Atualmente, substitudos por
mdulos genricos
Permitiu a aplicao
de efeitos complexos
genricos
Evoluo das GPUs
Hoje: pipeline de mdulos totalmente programveis
Operaes com inteiros e ponto flutuante de 32 bits
Estruturas de controle: ramificaes e laos
Leitura e escrita na memria global, etc.
Aplicaes Cientficas e Tecnolgicas
Apesar do aumento do poder computacional, ainda pouco

Fsicos querem criar mini buracos negros e analisar ExaBytes


de dados que so gerados nestes experimentos

Indstrias farmacuticas querem desenvolver nanorobs que


ataquem diretamente as clulas alvo

Projetistas de aeronaves querem fazer simulaes do


comportamento da
aeronave antes de
construir prottipos

Neurocientistas querem
fazer simulaes de
todo o crebro humano

Fonte: https://computing.llnl.gov/tutorials/parallel_comp/
Parte II

Introduo Pthreads
Processos

Cada processo independente dos demais


Possui sua memria privada
So executados em modo (pseudo-)paralelo,
dependendo do nmero de ncleos disponveis
25
Processos
Pilha (stack): onde so colocadas os parmetros de funes
ativas e as variveis locais
Memria dinmica (heap): onde trechos de memria podem
ser alocados dinamicamente
Registradores, arquivos abertos, sinais, bibliotecas
compartilhadas, variveis de ambiente, etc.

Um processo no tem acesso memria do outro.


Comunicao deve ser por meio de mensagens
Mas possvel mapear uma rea de memria para ambos

Alm disso, os processos normalmente so hierrquicos, isto


, cada processo pode ter processos, que por suas podem
criar novos processos filhos, etc.
26
Threads

So linhas de execuo, normalmente de um nico processo


Compartilham a memria do processo
Mas cada uma tem sua pilha de execuo, registradores,
informaes de escalonamento, etc.
27
Threads

28
Retirado de https://computing.llnl.gov/tutorials/pthreads/
Threads

29
Retirado de https://computing.llnl.gov/tutorials/pthreads/
Exemplo
Programa de processamento de imagens, onde se deseja
encontrar as faces nela presente.

Mltiplas threads:
- Um processo com a imagem da memria
- Cada thread trabalha com uma parte da imagem

Mltiplos processos:
- Cada processo armazena uma parte da imagem em sua
memria
- Respostas so comunicadas atravs de mensagens
para o processo pai

30
Threads
Em um nico computador, usar threads vantajoso, pois:
- So mais leves
- Possuem memria compartilhada
- Comunicao e sincronizao mais fcil

No Linux, o suporte a mltiplas threads fornecido por


implementaes do Pthreads (padro POSIX)
- Permite a criao de mltiplas threads
- Threads so criadas para executar alguma funo
definida pelo usurio
- Fornece suporte a mecanismos de sincronizao

31
Biblioteca Pthreads
Disponvel no Linux, UNIX e MacOS X
Linux: Verses no GNU CC (GCC) e Intel CC (ICC)

Biblioteca de baixo nvel


Permite controle total sobre os dados compartilhados
entre as threads, e a execuo de cada thread
Possui diversas primitivas de sincronizao
Normalmente outras bibliotecas alto-nvel, como OpenMP,
utilizam pthreads como base de sua implementao

32
Biblioteca Pthreads

Criao e trmino de threads Threads:


pthread_create(thread, attr, routine, arg)
pthread_exit(value_ptr)

33
#include <pthread.h> Exemplo Pthreads
#include <stdio.h>
#define NUM_THREADS 4

void *PrintHello(void *param)


Qual ser a
{ ordem de
printf("Hello World from new thread!\n"); impresso das
pthread_exit(NULL);
mensagens?
}

int main (int argc, char *argv[])


{
long t;
pthread_t threads[NUM_THREADS];
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
pthread_create(&threads[t], NULL, PrintHello, NULL);
}
printf("Hello World from master!\n");
pthread_exit(NULL);
}
34
Ponteiros no C
Identificados por *
int * a ponteiro para um inteiro

Pode apontar para um endereo


de memria da pilha de execuo
int patos = 12;
int *aves = &patos;

Pode apontar para memria alocada no heap


int *aves = (int *)malloc(sizeof(int));

35
Passagem de parmetros em Pthreads
Ponteiro do tipo void *
Pode apontar para tipos primitivos ou estruturas
int *aves = (int *)malloc(sizeof(int));
void *dados = aves;
pthread_create(&threads[t], NULL, teste, dados);

Dentro da funo, voc pode fazer o cast para o tipo original


void *teste(void *dados) {
int *passaros = (int *)dados;
(...)
}

Pode apontar para um endereo de memria da pilha de execuo


A funo onde a thread foi criada no deve ser finalizada antes da thread
melhor apontar para memria alocada no heap
Neste caso, a validade do endereo de memria garantida
36
Exemplo Pthreads com
#include <pthread.h>
#include <stdio.h>

alocao na pilha
#define NUM_THREADS 5

void *PrintHello(void *threadid)


{
long tid = *((long *)threadid);
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main (int argc, char *argv[])


{
pthread_t threads[NUM_THREADS];
long tid[NUM_THREADS];
long t;
for(t=0; t<NUM_THREADS; t++){
tid[t] = t;
printf("In main: creating thread %ld\n", t);
pthread_create(&threads[t], NULL, PrintHello, (void *)(&tid[t]));
}
pthread_exit(NULL);
}
37
#include <pthread.h>
#include <stdio.h>
Exemplo Pthreads
#define NUM_THREADS 5
com alocao no Heap
void *PrintHello(void *threadid)
{
long tid = *((long *)threadid);
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main (int argc, char *argv[])


{
pthread_t threads[NUM_THREADS];
long *tid = (long *) malloc ( NUM_THREADS * sizeof (long) );
long t;
for(t=0; t<NUM_THREADS; t++){
tid[t] = t;
printf("In main: creating thread %ld\n", t);
pthread_create(&threads[t], NULL, PrintHello, (void *)(&tid[t]));
}
pthread_exit(NULL);
} 38
Neste caso, a passagem do
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
id no funciona. Por que?
void *PrintHello(void *threadid)
{
long tid = *((long *)threadid);
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main (int argc, char *argv[])


{
pthread_t threads[NUM_THREADS];
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
pthread_create(&threads[t], NULL, PrintHello, (void *)&t);
}
pthread_exit(NULL);
}
39
Onde Aprender Mais?

https://computing.llnl.gov/tutorials/pthreads/

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

40

S-ar putea să vă placă și