Trabalho: Programação paralela multithread
Parte 1: Preparação
| Parte 2: Questões
| Parte 3: OpenMP
| Parte 4: Outro programa
| Entrega
| Material de apoio
Parte 1: Preparação
- Escolha um computador com mais de um núcleo de processamento. Verifique suas características (processador, memória).
- Baixe o arquivo pthreads_dotprod.zip para seu diretório pessoal. Este arquivo contém um programa que usa POSIX threads para cálculo de um produto escalar.
- Compile o programa:
make
- Execute o programa pthreads_dotprod usando 1 thread, para vetor de 1000000 de elementos, com 2000 repetições:
./pthreads_dotprod 1 1000000 2000
- Execute o mesmo programa usando 2 threads, com 500000 elementos para cada thread, 2000 repetições:
./pthreads_dotprod 2 500000 2000
O resultado deve ser o mesmo do caso anterior, mas o tempo de processamento deve ser diferente. - Estude o código-fonte do programa, verificando as funções que implementam o paralelismo.
- Observe que há uma segunda versão do programa em pthread_dotprod2.c. Esta versão tem 2 linhas a menos.
Parte 2: Questões
- Explique como encontram-se implementadas as 4 etapas de projeto: particionamento, comunicação, aglomeração, mapeamento (use trecho de código para ilustrar a explicação).
- Considerando o tempo (em segundos) mostrado na saída do programa, qual foi a aceleração com o uso de threads?
- A aceleração (speedup) se sustenta para outros tamanhos de vetores, números de threads e repetições? Para responder a essa questão, você terá que realizar diversas execuções, variando o tamanho do problema (tamanho dos vetores e número de repetições) e o número de threads (1, 2, 4, 8..., dependendo do número de núcleos). Cada caso deve ser executado várias vezes, para depois calcular-se um tempo de processamento médio para cada caso. Atenção aos fatores que podem interferir na confiabilidade da medição: uso compartilhado do computador tempos muito pequenos, etc.
- Elabore um gráfico/tabela de aceleração a partir dos dados obtidos no exercício anterior.
- Explique as diferenças entre pthread_dotprod.c e pthread_dotprod2.c. Com as linhas removidas, o programa está correto?
Parte 3: OpenMP
- Implemente um programa equivalente usando OpenMP.
- Avalie o desempenho do programa em OpenMP, usando os mesmos dados/argumentos do programa com threads POSIX.
Parte 4: Outro programa
- Escolha outro programa a ser paralelizado com threads (de preferência, um programa cujo código você já conheça). Pode ser o mesmo programa que você escolheu para fazer profiling no trabalho anterior, ou um programa feito em outra linguagem (Java, C++, etc.).
- Paralelize o programa usando OpenMP, ou uma ferramenta equivalente para a linguagem escolhida (por exemplo, JOMP ou JaMP para Java).
- Avalie o desempenho do programa paralelizado. Ficou melhor ou pior? Justifique.
Entrega
- Este trabalho pode ser feito individualmente ou em dupla.
- Até dia 08/04 (terça), no horário de aula, envie à professora uma descrição do programa escolhido para a parte 4. Indique também se o trabalho será individual ou em dupla.
- Até dia 14/04 (segunda, 23:59), publique no seu portfolio todo o material produzido para as partes 2, 3 e 4 do trabalho (código, gráficos, texto, etc.). Se o trabalho for feito em dupla, cada aluno deverá publicar uma cópia em seu portfolio.
Material de apoio
- POSIX Threads Programming
Tutorial do Lawrence Livermore National Laboratory (LLNL) sobre Pthreads. - Tutorial OpenMP
Tutorial do Lawrence Livermore National Laboratory (LLNL) sobre OpenMP.