• Nenhum resultado encontrado

Introdução Arquiteturas Paralelas Programação Paralela Geração de Malhas Particionamento de Malhas (Grafos) Balanceamento de Carga

N/A
N/A
Protected

Academic year: 2021

Share "Introdução Arquiteturas Paralelas Programação Paralela Geração de Malhas Particionamento de Malhas (Grafos) Balanceamento de Carga"

Copied!
60
0
0

Texto

(1)
(2)

 Introdução

 Arquiteturas Paralelas  Programação Paralela  Geração de Malhas

 Particionamento de Malhas (Grafos)  Balanceamento de Carga ro P ar an ae ns e de C om pu ta çã o  Balanceamento de Carga ro P ar an ae ns e de C om pu ta çã o

(3)

 Relembrando alguns conceitos da Parte I:

 O que é Computação Científica ?

 Projeto e analise de algoritmos para a solução de problemas em ciências e engenharia.

 E Computação Científica Paralela o que é ?

 Projeto e análise de algoritmos para a solução de problemas em ciências e engenharia adotando técnicas de paralelismo, para que

En co nt ro P ar an ae ns e de C om pu ta çã o

ciências e engenharia adotando técnicas de paralelismo, para que esses algoritmos possam ser executados em máquinas paralelas. Essa abordagem visa a obtenção de resultados de maneira mais

rápida, os quais nem sempre poderiam ser obtidos

seqüencialmente. En co nt ro P ar an ae ns e de C om pu ta çã o

(4)

Parte II – Objetivos

 Apresentar o ambiente computacional utilizado na computação científica paralela

 Apresentar algumas técnicas, bibliotecas e ferramentas utilizadas ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(5)

 Conceitos Básicos:

 Concorrência x Paralelismo

 Concorrência

(pseudo-paralelismo):

 Vários processos têm suas

execuções intercaladas  Paralelismo (físico): En co nt ro P ar an ae ns e de C om pu ta çã o  Paralelismo (físico):  Necessidade de mais de um processador

 Mais de um processo sendo

executado no mesmo intervalo de tempo Enco nt ro P ar an ae ns e de C om pu ta çã o

(6)

 Há três maneiras de fazer qualquer tarefa mais rápido:

1. Trabalhar mais rápido (CPU)

2. Trabalhar de maneira mais inteligente (Algoritmo) 3. Pedir ajuda (Processamento Paralelo)

 Algumas classes de problemas:

ro P ar an ae ns e de C om pu ta çã o

 Algumas classes de problemas:

 São grandes demais para máquinas seqüenciais: tempo de execução muito longo ou exigem muita memória

ro P ar an ae ns e de C om pu ta çã o

(7)

 Classificação de Flynn

 Fluxos de instruções e fluxos de dados  4 classes:

 SISD - Single Instruction/Single Data stream  SIMD - Single Instruction/Multiple Data stream  MISD – Multiple Instruction/Single Data

 MIMD - Multiple Instruction/Multiple Data stream

En co nt ro P ar an ae ns e de C om pu ta çã o

 MIMD - Multiple Instruction/Multiple Data stream

 MIMD: classe dos computadores paralelos

 Arquiteturas MIMD ainda podem ser divididas em duas

subcategorias:  memória compartilhada En co nt ro P ar an ae ns e de C om pu ta çã o

(8)

 Memória Compartilhada:

 Todos os processadores possuem acesso a uma memória

compartilhada

 Multiprocessadores

 Comunicação: através da memória compartilhada

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(9)

 Memória Distribuída:

 Multicomputadores

 Neste tipo de arquitetura, cada nó tem seu processador, sua

unidade de controle e sua memória local

 Cada processador pode executar um processo independente sobre

seus próprios dados

 Estrutura de rede é fundamental

En co nt ro P ar an ae ns e de C om pu ta çã o

 Comunicação: troca de mensagens

En co nt ro P ar an ae ns e de C om pu ta çã o

(10)

Tendências:

 Processadores vetoriais

 poucos processadores vetoriais  memória compartilhada

 já não aparecem no top 500

 SMP

 processadores de uso geral  memória compartilhada co nt ro P ar an ae ns e de C om pu ta çã o  memória compartilhada

 MPP (Massively Parallel Processors)

 multicomputador constituído de milhares de processadores de uso geral  rede proprietária

 DOE/NNSA/LLNL (USA) eServer Blue Gene Solution(IBM) 131072 procs

Clusters cont ro P ar an ae ns e de C om pu ta çã o

(11)

Cluster:

Clusters são agregados de máquinas independentes interconectados através de uma rede;

 Hardware (máquinas + redes de interconexão)

Máquinas que formam o cluster:

Multiprocessadas formando uma arquitetura

En co nt ro P ar an ae ns e de C om pu ta çã o

Multiprocessadas formando uma arquitetura com memória distribuída entre os nodos e compartilhada entre os processadores (memória híbrida)

Monoprocessadas formando uma arquitetura

com apenas memória distribuída Enco

nt ro P ar an ae ns e de C om pu ta çã o

(12)
(13)
(14)

 Modo de programação depende da arquitetura:

 Memória compartilhada  Memória distribuída

Biblioteca de multithreading: exploração do paralelismo

intra-nodal:  Pthreads POSIX; ro P ar an ae ns e de C om pu ta çã o  Pthreads POSIX;  OpenMP; ro P ar an ae ns e de C om pu ta çã o

(15)

 Padrão Posix

 EEE POSIX 1003.1c standard (1995)

 Distribuída junto ao sistema Operacional Linux  Pthreads é definido como um conjunto de

procedimentos e tipos em C (pthread.h)

 Contém mais de 60 funções

En co nt ro P ar an ae ns e de C om pu ta çã o

 Contém mais de 60 funções

 Compilação:

gcc –o <nome_exec> <nome_fonte> -lpthread Enco

nt ro P ar an ae ns e de C om pu ta çã o

(16)

Um thread é definido por uma função

 Descreve o corpo de execução de um thread  Função pode receber parâmetros (void *)

 Ao final de sua execução, retorna um valor (void *)  void *: flexibilidade ro P ar an ae ns e de C om pu ta çã o 

Protótipo

void <nome_func> (void *args) ro Par

an ae ns e de C om pu ta çã o

(17)

Criação de threads: pthread_create

int pthread_create(pthread_t *tid, const pthread_arrt_t

atrib, void * funcao(void *), void *args)

 funcao: nome da função a ser executada

 atrib: atributos para a execução (NULL para default)  args: parâmetros de entrada para a thread

 tid:identificador da thread

En co nt ro P ar an ae ns e de C om pu ta çã o

 tid:identificador da thread

En co nt ro P ar an ae ns e de C om pu ta çã o

(18)

Término de thread:

 return ou pthread_exit;

 Ciclo de vida de um thread refere-se ao tempo necessário à execução da função

 Ao executar sua última instrução, o thread é destruído ro P ar an ae ns e de C om pu ta çã o destruído  pthread_exit(void *);

 Termina a thread, retornando um dado

ro P ar an ae ns e de C om pu ta çã o

(19)

En co nt ro P ar an ae ns e de C om pu ta çã o #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5

void *PrintHello(void *threadid) {

printf("\n%d: Hello World!\n", threadid);

pthread_exit(NULL);

}

int main (int argc, char *argv[]) { En co nt ro P ar an ae ns e de C om pu ta çã o { pthread_t threads[NUM_THREADS]; int rc, t; for(t=0; t<NUM_THREADS; t++){ printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);

if (rc){

printf("ERROR; return code - pthread_create() is %d\n", rc); exit(-1);

(20)

 Sincronização entre threads:  pthread_join  Sincronização explícita: ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(21)

Sincronização entre threads

 pthread_join(pthread_t tid, void **ret)

 tid: identificação da thread a ser sincronizada  ret: endereço de memória do dado retornado

 Invocação à pthread_join bloqueia a thread

invocante, enquanto a sincronização não tenha terminado En co nt ro P ar an ae ns e de C om pu ta çã o terminado for(t=0; t<NUM_THREADS; t++) {

rc = pthread_join(thread[t], (void **)&ret);

} En co nt ro P ar an ae ns e de C om pu ta çã o

(22)

 Passagem de Parâmetros

 Através de memória compartilhada (variáveis globais)  Alteração visível para todas as threads

 Através de parâmetros da função específica da thread  Tipo void*

 Para a passagem de mais parâmetros, criar uma struct e fazer o cast (void *)  Exemplo: ro P ar an ae ns e de C om pu ta çã o  Exemplo:

void * thread_function( void *) { int code = 0; ro Par an ae ns e de C om pu ta çã o

(23)

En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o

(24)

 Padrão

 Diversas implementações: LAM, MPICH, MPI-F...  125 funções  C e Fortran  Paralelismo Explícito ro P ar an ae ns e de C om pu ta çã o  Paralelismo Explícito  Primitivas:  Gerência de processos ro P ar an ae ns e de C om pu ta çã o

(25)

 Compilação:

mpicc –o <exec> <fonte.c>

 Execução:

mpirun –np <num_proc> <exec> -nolocal -machinefile <nomearq>

En co nt ro P ar an ae ns e de C om pu ta çã o Exemplo:

mpirun –np 10 teste -nolocal -machinefile nodos

En co nt ro P ar an ae ns e de C om pu ta çã o

(26)

 Rotinas Básicas  MPI_Init  MPI_Comm_rank  MPI_Comm size  MPI_Send  MPI_Recv ro P ar an ae ns e de C om pu ta çã o  MPI_Recv  MPI_Finalize  MPI_Bcast ro P ar an ae ns e de C om pu ta çã o

(27)

//Exemplo 1

#include "mpi.h“ #include <stdio.h>

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

int processId; /* rank dos processos */

int noProcesses; /* Número de processos */ int nameSize; /* Tamanho do nome */

char computerName[MPI_MAX_PROCESSOR_NAME]; En co nt ro P ar an ae ns e de C om pu ta çã o char computerName[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &noProcesses);

MPI_Comm_rank(MPI_COMM_WORLD, &processId);

MPI_Get_processor_name(computerName, &nameSize);

printf("Hello from process %d on %s\n", processId, computerName); Enco

nt ro P ar an ae ns e de C om pu ta çã o

(28)

//Exemplo 2

#include <stdio.h> #include "mpi.h“

int main(int argc, char **argv) {

int myrank,src, dest, p, tag = 1;

En co nt ro P ar an ae ns e de C om pu ta çã o if (myrank != 0) {

sprintf(msg, "Hello world from process %d\n", myrank); dest = 0;

MPI_Send(msg, strlen(msg)+1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);

} else

int myrank,src, dest, p, tag = 1; char msg[256];

MPI_Status status;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, Enco nt ro P ar an ae ns e de C om pu ta çã o {

printf("Hello world from process %d\n", myrank); for (src = 1; src < p; src++)

{

MPI_Recv(msg, 256, MPI_CHAR, src, tag, MPI_COMM_WORLD, &status);

(29)

//Exemplo 3

#include <stdio.h> #include <stdlib.h> #include "mpi.h“

int main(int argc, char **argv ) { char message[20]; En co nt ro P ar an ae ns e de C om pu ta çã o if(rank == 0) {

strcpy(message, "Hello, world"); }

MPI_Bcast(&message, 20, MPI_CHAR, 0, MPI_COMM_WORLD); printf("process ID :: %d\t%s\n", rank, char message[20]; int rank; int size; MPI_Status status;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); En co nt ro P ar an ae ns e de C om pu ta çã o printf("process ID :: %d\t%s\n", rank, message); MPI_Finalize(); return 0; }

(30)

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(31)

 O domínio para aplicações paralelas é, geralmente,

representado por uma malha bi ou tri-dimensional

 Uma malha é uma estrutura composta por vértices (ou

nodos) e arestas

 Modelos matemáticos podem ser discretizados

empregando estas estruturas

En co nt ro P ar an ae ns e de C om pu ta çã o  Tipos  Estruturadas  Não estruturadas En co nt ro P ar an ae ns e de C om pu ta çã o

(32)

 Software para a geração de malhas:  Triangle

 Desenvolvido em C, por Jonathan R. Shewchuk, para a

geração e construção de malhas bidimensionais

 http://www.cs.cmu.edu/~quake/triangle.html  Visualizador: Showme ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(33)

 Entrada de dados (PSLG):  Primeira linha:  Número de vértices  Dimensão (sempre 2)  Atributos (geralmente 0)  Marcadores de fronteira (0 ou 1)  Linhas seguintes:

 <Número do vértice> <x> <y> <marcador> Uma linha: En co nt ro P ar an ae ns e de C om pu ta çã o Exemplo: 4 2 0 0 1 0 0 2 1 0 3 1 1 4 0 1  Uma linha:  Número de segmentos  Marcadores de fronteira  Linhas seguintes:

 <Número do segmento> <vértice1> <vértice2>  Uma linha Número de buracos En co nt ro P ar an ae ns e de C om pu ta çã o 4 0 1 1 2 2 2 3 3 3 4 4 4 1

(34)

 Saída de dados:

 Arquivo de nodos (.node)  Arquivo de elementos (.ele)  Arquivo de áreas (.area)  Arquivo de arestas (.edge)

 Arquivos de vizinhança (.neigh)

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(35)

Triangle:

 Execução:

 triangle [-pqn] input_file

Opções:

 p : gera a malha a partir de um PSLG

 q : gera malhas com triângulos com ângulos maiores que 20

graus (melhor qualidade)

En co nt ro P ar an ae ns e de C om pu ta çã o

graus (melhor qualidade)

 n : gera a lista de vizinhança de cada triângulo

Demais opções:  http://www.cs.cmu.edu/~quake/triangle.switch.html En co nt ro P ar an ae ns e de C om pu ta çã o

(36)

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(37)

O particionamento de uma malha é equivalente

ao particionamento de um grafo

Particionamento de um grafo (PG):

 Consiste em dividir seus vértices em K subconjuntos, de forma que estes subconjuntos sejam balanceados (com o mesmo número de vértices), e que o número

En co nt ro P ar an ae ns e de C om pu ta çã o

(com o mesmo número de vértices), e que o número de arestas entre eles seja minimizado;

En co nt ro P ar an ae ns e de C om pu ta çã o

(38)

 Na computação paralela o maior uso de grafos está no

particionamento da malha entre os processadores

 O PG é um problema NP-difícil. Assim não se pode

encontrar soluções ótimas para o mesmo, mas uma

aproximação através do emprego de métodos heurísticos

 Algumas heurísticas: co nt ro P ar an ae ns e de C om pu ta çã o  Particionamento em faixas  Métodos de Bissecção  Método Multinível co nt ro P ar an ae ns e de C om pu ta çã o

(39)

 METIS

 Disponível em:

http://glaros.dtc.umn.edu/gkhome/metis/metis/overview

 Conjunto de algoritmos multinível implementados  METIS: Programas

 kmetis (mais de 8 partições)

En co nt ro P ar an ae ns e de C om pu ta çã o

 kmetis (mais de 8 partições)

 pmetis (quantidade pequena de partições)  partdmesh (particionamento de elementos)  partnmesh (particionamento nos nós)

En co nt ro P ar an ae ns e de C om pu ta çã o

(40)

 Execução:

pmetis GraphFile Npartskmetis GraphFile Npartspartnmesh MeshFile Npartspartdmesh MeshFile Nparts

ro P ar an ae ns e de C om pu ta çã o  Exemplo:  pmetis teste.dat 8 ro P ar an ae ns e de C om pu ta çã o

(41)

 METIS: Formato de arquivos

 Grafos simples (sem peso nas arestas e vértices):  Primeira linha:

 Número de vértices  Número de arestas

 As demais n linhas armazenam informações estruturais do grafo

En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o 7 11 5 3 2 1 3 4 2 3 6 7 1 3 6 5 4 7

(42)

 METIS: Formato de arquivos  Malha

 Primeira linha

 Números de elementos da malha  Tipo de elementos:

 Triângulos (1), tetraedro (2), hexaedro (cubo) (3), ou quadriláteros (4)

 As outras n linhas armazenam os nodos de cada elemento

ro P ar an ae ns e de C om pu ta çã o

 As outras n linhas armazenam os nodos de cada elemento

ro P ar an ae ns e de C om pu ta çã o 5 1

(43)

En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o

(44)

 O problema de balanceamento de carga consiste em

atribuir cargas proporcionais entre diversos processadores

 Em aplicações paralelas que possuem pontos de

sincronismo o balanceamento de carga objetiva diminuir o tempo ocioso dos processadores

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(45)

 Balanceamento de carga pode ser:

Estático:

 Ocorre quando toda a informação para o balanceamento está

disponível antes do processamento.

Semi-estático:

 Utilizado em situações onde o domínio é alterado lentamente

ao longo do tempo. Neste caso, pode-se empregar um algoritmo estático no início da aplicação e permitir que a mesma possua algum desbalanceamento após um certo número de passos, quando então é aplicado novamente o

En co nt ro P ar an ae ns e de C om pu ta çã o

número de passos, quando então é aplicado novamente o algoritmo estático.

Dinâmico:

 Utilizado em situações onde a carga dos processadores varia

durante a execução tornando necessário a redistribuição de carga para manter o equilíbrio. Alguns autores não diferenciam balanceamento semi-estático de balanceamento

dinâmico. En co nt ro P ar an ae ns e de C om pu ta çã o

(46)

 Avaliação do custo/benefício:

 Deve ser considerada no cálculo do reparticionamento e/ou da

nova migração de dados, pois é necessário levar em conta que esse processo têm seu custo que pode ser significativo.

 Detecção de carga:

 É obtida usando métricas e/ou algoritmos que indiquem quais

processadores estão desbalanceados. Como o custo de redistribuir a carga é elevado, pois deve-se parar o

ro P ar an ae ns e de C om pu ta çã o

processadores estão desbalanceados. Como o custo de redistribuir a carga é elevado, pois deve-se parar o processamento e recalcular a malha local ou global, então antes de reparticioná-la e mapeá-la novamente, deve-se verificar se a

relação custo/beneficio é compensatória. ro Par

an ae ns e de C om pu ta çã o

(47)

 O balanceamento deve ser feito de forma a atender três

requisitos básicos:

 A carga de trabalho deve ser bem balanceada entre os

processadores;

 A comunicação entre os processadores deve ser minimizada;  O tempo de execução do algoritmo de balanceamento deve ser

tal que o ganho obtido com seu uso seja maior que o custo de sua execução. En co nt ro P ar an ae ns e de C om pu ta çã o sua execução.

 O balanceamento de carga dinâmico pode ser

classificado em três tipos:  Difusão;  Reparticionamento;  Scratch-remap. En co nt ro P ar an ae ns e de C om pu ta çã o

(48)

 Difusão

 Garantem uma partição de boa qualidade, com pouca

comunicação entre os subdomínios e com pouca movimentação de dados para a realização da nova partição

 Em domínios com um desbalanceamento alto concentrado em

determinadas regiões, algoritmos difusivos podem resultar em uma migração de células excessivamente alta, devido à

ro P ar an ae ns e de C om pu ta çã o

uma migração de células excessivamente alta, devido à propagação da difusão em grandes áreas

 Neste esquema, a cada passo de tempo, cada processador

avalia sua carga e compara sua carga com a dos seus vizinhos.

ro P ar an ae ns e de C om pu ta çã o

(49)

 Difusão

 Um aspecto importante dos métodos de difusão é a sua

convergência, se será atingida uma situação onda a carga esteja bem distribuída e o número de passos necessários para atingir essa situação. En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o

(50)

 Reparticionamento

 Quando a malha é alterada durante a execução, essa estratégia

recalcula o particionamento partindo do zero, sem levar em conta as informações atuais do particionamento.

ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(51)

Scratch-remap

 Calculam uma nova partição e mapeiam a nova partição para a

partição existente.

 Estes algoritmos funcionam bem para grafos com um

desbalanceamento alto e concentrado em algumas sub-regiões do domínio.

 Em domínios com um desbalanceamento baixo ou bem

En co nt ro P ar an ae ns e de C om pu ta çã o

 Em domínios com um desbalanceamento baixo ou bem

distribuído em todo o domínio, esta abordagem pode resultar em uma transferência excessiva de células, se comparado aos algoritmos de difusão multinível.

En co nt ro P ar an ae ns e de C om pu ta çã o

(52)

 Mapeamento:

 O problema do particionamento de malha e balanceamento

de carga pode ser visto como um problema de mapeamento

de grafos

 Deve-se encontrar um mapeamento, do grafo da aplicação

para o grafo da arquitetura, de modo a maximizar a relação computação/comunicação

 Assim, o mapeamento deve considerar a arquitetura e a rede

de interconexão, e com essas informações construir uma

nt ro P ar an ae ns e de C om pu ta çã o

de interconexão, e com essas informações construir uma

solução visando a diminuição das comunicações e do

balanceamento de carga nt ro P ar an ae ns e de C om pu ta çã o

(53)

 Resolução de sistemas de equações via Multigrid  Guilherme Galante – dissertação de mestrado

 Estudo e implementação de métodos de resolução de

sistemas:

 Utilizando malhas não estruturadas na discretização dos

domínios En co nt ro P ar an ae ns e de C om pu ta çã o domínios

 Empregando métodos multigrid e decomposição de

domínios

 Aplicar os métodos de solução na solução problemas reais:

 Transferência de calor Hidrodinâmica (UnHIDRA) En co nt ro P ar an ae ns e de C om pu ta çã o

(54)

ro P ar an ae ns e de C om pu ta çã o Escopo do Trabalho ro P ar an ae ns e de C om pu ta çã o

(55)

 Etapa 1: Geração e Particionamento de Malhas En co nt ro P ar an ae ns e de C om pu ta çã o *

informação das malhas

 Etapa2: Criação da Hierarquia de Malhas

En co nt ro P ar an ae ns e de C om pu ta çã o

(56)

 Etapa 3: Montagem dos sistemas de Equações ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o

(57)

 Etapa 3: Resolução Paralela En co nt ro P ar an ae ns e de C om pu ta çã o  Métodos Iterativos  GMRES  Multigrid  Full Multigrid V

 Métodos de Decomposição de Domínio En

co nt ro P ar an ae ns e de C om pu ta çã o

(58)

ro P ar an ae ns e de C om pu ta çã o Hidrodinâmica Guaíba - Níveis da Água ro P ar an ae ns e de C om pu ta çã o

(59)

En co nt ro P ar an ae ns e de C om pu ta çã o Transferência de Calor En co nt ro P ar an ae ns e de C om pu ta çã o

(60)

ro P ar an ae ns e de C om pu ta çã o Guilherme Galante www.inf.unioeste.br/~guilherme Professor Assistente Informática – Unioeste gui.galante@gmail.com Rogério L. Rizzi ro P ar an ae ns e de C om pu ta çã o Rogério L. Rizzi Professor Adjunto Matemática – Unioeste rogeriorizzi@gmail.com

Referências

Documentos relacionados

No entanto, maiores lucros com publicidade e um crescimento no uso da plataforma em smartphones e tablets não serão suficientes para o mercado se a maior rede social do mundo

O valor da reputação dos pseudônimos é igual a 0,8 devido aos fal- sos positivos do mecanismo auxiliar, que acabam por fazer com que a reputação mesmo dos usuários que enviam

Se você vai para o mundo da fantasia e não está consciente de que está lá, você está se alienando da realidade (fugindo da realidade), você não está no aqui e

Inscrições na Biblioteca Municipal de Ourém ou através do n.º de tel. Organização: Município de Ourém, OurémViva e grupos de teatro de associações e escolas do

De seguida, vamos adaptar a nossa demonstrac¸ ˜ao da f ´ormula de M ¨untz, partindo de outras transformadas aritm ´eticas diferentes da transformada de M ¨obius, para dedu-

6 Consideraremos que a narrativa de Lewis Carroll oscila ficcionalmente entre o maravilhoso e o fantástico, chegando mesmo a sugerir-se com aspectos do estranho,

Ali diz que, ao voltar, Jesus permanecerá nos ares enquanto somos levados ao Seu encontro: “Porquanto o Senhor mesmo, dada a Sua palavra de ordem, ouvida a voz do arcanjo, e ressoada

Apresentaremos a seguir alguns resultados que serão fundamentais para obtermos uma generalização dos teoremas das seçãos anterior para uma versão com tempo contínuo. Consideremos