Minicursos

Junto aos artigos aceitos, o ERAD/RS 2022 apresenta diversas palestras e minicursos a seus participantes. Os minicursos planejados para este evento são apresentados a seguir.

A evolução das arquiteturas paralelas aponta para ambientes dinâmicos nos quais o número de recursos ou configurações disponíveis pode variar durante a execução dos aplicativos. Isso pode ser facilmente observado em grades e nuvens, mas também pode ser explorado em clusters e arquiteturas de multiprocessadores. Ao longo de mais de duas décadas, várias iniciativas de pesquisa abordaram a exploração dessa característica por aplicativos paralelos, permitindo o desenvolvimento de aplicativos adaptativos que podem reconfigurar o número de processos/threads e seu mapeamento para processadores para lidar com cargas de trabalho variáveis e mudanças na disponibilidade de recursos no sistema. Apesar da longa história de desenvolvimento de soluções para adaptabilidade nas mais diversas arquiteturas paralelas, não há literatura atualizada revisando esses esforços.

Nesse contexto, o objetivo deste minicurso é apresentar o estado da arte sobre adaptabilidade em pontos de vista de recursos e aplicativos, desde arquiteturas de memória compartilhada, clusters e grades, até recursos baseados em virtualização em neblina e computação em nuvem. Uma análise abrangente das principais iniciativas de pesquisa em aplicações paralelas adaptativas pode fornecer aos leitores a compreensão da abolição dos conceitos essenciais sobre a evolução da área. Além disso, esta revisão pode ajudar estudantes e pesquisadores a identificar as lacunas essenciais e oportunidades de tendências nesta área de investigação.

Autores: Rodrigo da Rosa Righi (UNISINOS) e Guilherme Galante (UNIOESTE).

Dia e horário: 18/04/2022, das 9 h às 12 h.

Local: Auditório da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h 30 min.

Nível: intermediário.

Pré-requisitos: é importante saber o funcionamento básico de arquiteturas com multiprocessadores e multicomputadores.

Tópicos que serão abordados:
    – O que são aplicações estáticas e fixas;
– Problemas em prover adaptabilidade;
– Adaptabilidade em memória compartilhada;
– Adaptabilidade em cluster computing, grid computing, cloud e fog computing;
– Uma visão de futuro na área.

Slides

Este minicurso apresentará uma introdução à programação de GPUs com OpenMP. Apesar da enorme capacidade de processamento, GPUs possuem arquitetura bem mais complexa quando comparadas com as CPUs. Tais diferenças advém não ocorrem por mero acaso, mas são decorrentes dos diferentes objetivos de projeto. O projeto de CPUs visa diminuir a latência de execução de aplicações single thread, enquanto que as GPUs são projetadas para fornecer alta vazão de processamento. Com isso, extrair bom desempenho de aplicações em GPUs pode ser um pouco mais trabalhoso do que nas CPUs. Além disso, GPUs tendem a apresentar maior variedade de arquiteturas, o que compromete o desempenho de aplicações quando executadas em GPUs de diferentes fabricantes ou diferentes gerações.

Criada em 1996, OpenMP é uma ferramenta já bem estabelecida para o desenvolvimento de aplicações de alto desempenho baseadas em threads. OpenMP e MPI são ferramentas que estão entre as mais utilizadas para se fazer processamento numérico mais intensivo em praticamente todas as áreas da engenharia, ciências físicas, ciências biológicas, entre outras. Desde então, OpenMP evoluiu muito para acompanhar a evolução das arquiteturas de CPUs e aceleradores com dezenas ou até centenas de núcleos ou threads, arquiteturas NUMA, unidades vetoriais, e outros avanços. A partir da versão 4.0 (2013), OpenMP passou a dar suporte à execução em sistemas heterogêneos, compostos por um hospedeiro e um dispositivo (e.g., uma CPU e uma GPU).

Um dos aspectos mais interessantes do OpenMP é o vasto ferramental (principalmente stacks de compiladores) que atualmente suporta o padrão e permite gerar código executável para uma imensa variedade de arquiteturas, de CPUs a GPUs, passando por outros tipos de aceleradores manycore incluindo arquiteturas heterogêneas com combinações de CPUs e aceleradores ou de múltiplos aceleradores. Nesse sentido, OpenMP tem evoluído no sentido de possibilitar que um mesmo código possa executar com desempenho aceitável em diferentes arquiteturas sem modificações ou com modificações mínimas (portabilidade de desempenho). Tais características são essenciais para a sustentabilidade e manutenibilidade de aplicações a médio e longo prazo.

Durante o minicurso, os conceitos serão aplicados em dois exemplos de programas: um deles que calcula o valor de pi por integração e o segundo, que simula a propagação da onda acústica em um domínio isotrópico. Os conceitos serão aplicados em versões sucessivamente melhoradas desses dois programas, analisando os seus efeitos sobre o desempenho dos programas.

Autores: Hermes Senger (UFSCAR) e Jaime Freire de Souza (UFSCAR).

Dia e horário: 18/04/2022, das 9 h às 12 h.

Local: Lab. 1/2 da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h 30 min.

Nível: intermediário.

Pré-requisitos: é necessário ter domínio de pelo menos uma linguagem de programação. São desejáveis conhecimentos básicos de Arquitetura de Computadores e Sistemas Operacionais (threads, processos).

Tópicos que serão abordados:
    – Visão geral do OpenMP (15 min): a pilha de compiladores e ferramentas, ferramental disponível que suporta;
    – O modelo de programação host/device de OpenMP (15 min): regiões paralelas, paralelismo de fork/join, o uso da diretiva #pragma omp target;
    – Controlando a movimentação de dados entre host e device (30 min);
    – Divisão e compartilhamento de trabalho de laços (worksharing) entre elementos de processamento (30 min): worksharing na CPU, worksharing na GPU.
    – Threads, times (teams) e ligas (leagues) (15 min) – diretivas teams e distribute;
    – Como acelerar sua aplicação em GPUs (30 min): outras otimizações, tais como “colapse” de laços, vetorização etc;
    – Os exemplos e exercícios serão testados e executados no ambiente Google Colab, podendo utilizar dispositivos remotos como GPUs e TPU (15 min);
    – Noções básicas de perfilamento de código (nvprof ou NSight) (30 min): serão demonstrados pelos professores alguns exemplos de perfilamento a posteriori de programas previamente executados. 

Slides
Repositório do Github

Este minicurso é uma introdução à programação com memória persistente (PM). Nele, apresentaremos a motivação para uso dessa nova tecnologia, o suporte atual disponibilizado por processadores e sistemas operacionais, os problemas de consistências de dados que podem acontecer, e como utilizar abstrações de mais alto nível (como transações) para resolvê-los. O minicurso também apresentará uma série de exemplos práticos utilizando o Intel PMDK para programação de várias estruturas de dados persistentes.

Autores: Alexandro Baldassin (UNESP) e Emilio Francesquini (UFABC).

Dia e horário: 18/04/2022, das 9 h às 12 h.

Local: Lab. 5 da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h 30 min.

Nível: básico.

Pré-requisitos: será assumido apenas conhecimento básico sobre programação, ou seja, alunos que tenham visto alguma disciplina sobre programação estariam aptos para acompanhar o conteúdo. É claro que alunos com um conhecimento mais aprofundado em disciplinas que envolvam arquitetura da computadores e sistemas operacionais se beneficiarão mais do curso.

Tópicos que serão abordados: 
    – Introdução – nesta seção, será discutido o que é PM, a motivação para sua introdução e relevância. Também discutiremos aspectos arquiteturais, como a diferença para DRAM, domínio de persistência e o papel dessa nova tecnologia na hierarquia de memória. Por fim, falaremos sobre a PM introduzida recentemente pela Intel, conhecida como Intel Optane DC;
    – Suporte do Sistema Operacional – nesta partes serão discutidos os suportes atuais em sistemas operacionais para PM, como mapeamento de memória (memory map) e DAX, padronizados pela SNIA (Storage Networking Industry Association);
    – Conceitos fundamentais para programação – nesta seção, serão apresentados os principais itens referentes à programabilidade de PM. Começaremos com uma abordagem de mais baixo nível que utiliza diretamente o suporte do processador (instruções flush) para implementar o que chamamos de seções atômicas com relação a falhas ou simplesmente FASEs (Failure-Atomic SEctions). Depois discutiremos abordagens de mais alto nível que usam épocas, locks e transações;
    – Exemplos práticos: Introdução ao PMDK – esta última parte dará uma visão mais prática do tema discutido até o momento utilizando a biblioteca PMDK (Persistent Memory Development Kit) da Intel. Aqui mostraremos vários exemplos de como implementar, compilar e executar algumas estruturas de dados persistentes utilizando essa biblioteca

Slides
Repositório do Github

No passado, o aumento de desempenho das aplicações dava-se de forma transparente aos programadores devido ao aumento do paralelismo a nível de instruções ou ao aumento de frequência dos processadores. Atualmente, para se ganhar desempenho nas arquiteturas modernas, é necessário conhecimentos sobre programação paralela.

Este minicurso tem como objetivo apresentar o uso de programação paralela com uma linguagem moderna, de fácil uso e aprendizado, Julia. Ele permitirá aos participantes aprender a prototipar aplicações paralelas simples em Julia e a rodar aplicações complexas já existentes, sejam elas multicore, multi-node e em GPU escritas em Julia num ambiente típico de computação de alto desempenho utilizando um gerenciador de processos como o Slurm.

Também discutiremos as adaptações necessárias a fazer para obter o mesmo fim utilizando computação em nuvem. Ao fim, apresentaremos comparações de desempenho frente a outras linguagens, como C, Fortran e Python, de modo que o usuário possa decidir quando Julia pode ser uma boa aliada.

Autores:
Roberto Machado Velho (IMPA), Rafael Benchimol Klausner (PSR Consultoria Ltda.) e Matheus da Silva Serpa (UFRGS).

Dia e horário: 19/04/2022, das 9 h 30 às 12 h.

Local: Lab. 1/2 da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h.

Nível: intermediário.

Pré-requisitos: o minicurso foi projetado para familiarizar os alunos com o uso da Linguagem Julia para computação paralela. É necessário, portanto, conhecimento de Julia ou de uma linguagem similar, como Python, R, Matlab, C, Fortran ou Java. É importante que o estudante tenha noções plenas de algoritmos e estruturas de dados elementares. Conhecimentos sobre arquiteturas de computadores (multicore, multi-node, GPU), sistemas operacionais, redes de computadores e sistemas paralelos e distribuídos auxiliam para um maior aprendizado deste minicurso. Por ser um curso extremamente prático, deseja-se que os estudantes tenham ainda habilidade e prática na compilação e execução de códigos fonte e executáveis, além do uso da linha de comando e acesso remoto via ssh. Por ser um minicurso intermediário, deseja-se atender estudantes com um mínimo de formação (a partir do quarto semestre de um curso de graduação em Computação, Matemática Aplicada ou similares).

Tópicos que serão abordados: este minicurso envolve o estudo de aspectos relacionados à arquitetura de computadores e à elaboração, execução e teste de programas concorrentes utilizando a linguagem de programação Julia. Serão introduzidos rapidamente os conceitos de programação para ambientes de memória compartilhada, multicore, multi-node e GPU. Com base nesses, mostraremos como é possível rapidamente prototipar aplicações paralelas utilizando Julia, bem como rodar em ambiente de computação de alto desempenho aplicações complexas já escritas nesta linguagem.

Além de programas criados durante o minicurso, também serão disponibilizados códigos-fonte sequenciais e paralelos previamente criados e testados. Estes exemplos de código serão incrementais, isto é, variações do mesmo código para testar aspectos distintos oferecidos pelas interfaces de programação.

Por fim, alguns tópicos de testes, depuração e medição de desempenho serão citados, com o intuito de demonstrar como são feitas avaliações de performance de aplicações paralelas.

A estrutura do minicurso é dividida em partes, a saber:
1 – Apresentação da linguagem Julia em Terminal;
2 – Utilização de Pacotes em Julia, medição de tempo de computação, onde encontrar referências para utilização de Julia em computação em paralelo;
3 – O paradigma multicore em Julia num cluster computacional típico (exemplo utilizando o gerenciador slurm);
4 – Exemplos progressivos em ambiente multicore;
5 – O paradigma multi-node em Julia;
6 – Exemplos progressivos em ambiente multi-node;
7 – O paradigma de programação utilizando GPUs em Julia;
8 – Exemplos de programação em GPU;
9 – Adaptações necessárias ao uso de Julia para programação na Nuvem;
10 – Comparações com o uso de outras linguagens de programação para computação em paralelo.

Slides

Inspirado no Computer Language Benchmarks Game, este minicurso revisa conceitos essenciais para a avaliação e comparação de programas, incluindo exemplos e demonstrações ao vivo de como aplicá-los. Será dividido em duas partes: a primeira aborda os aspectos gerais, enquanto a segunda foca na análise individual de um programa.

Autores: Alfredo Goldman (USP), Sarita Mazzini Bruschi (USP) e Elisa Uhura (USP).

Dia e horário: 19/04/2022, das 9 h 30 às 12 h.

Local: Lab. 5 da Informática.

Público-alvo: alunos de graduação e de pós-graduação.

Duração: 2 h.

Nível: Básico.

Pré-requisitos: Conhecimento básico de C e Make.

Tópicos que serão abordados:
    – Análise de desempenho de programas.

Slides
Repositório do Github

Impulsionado pelo desenvolvimento de novas tecnologias, como assistentes pessoais ou carros autônomos, o aprendizado de máquina, do inglês, Machine Learning, tornou-se rapidamente um dos campos mais ativos da ciência da computação. Os algoritmos de ML são notoriamente exigentes em termos de recursos. Portanto, é de suma importância otimizar sua operação em processadores modernos. Várias abordagens foram propostas para acelerar o aprendizado tais como processador multicore e manycore, GPUs, TPUs, computadores massivamente paralelos, entre outros.

Nesse contexto, este minicurso objetiva propiciar um maior entendimento sobre a aceleração de kernels de ML utilizando os paradigmas de programação paralela e vetorial, de forma que os participantes aprendam a otimizar adequadamente suas aplicações para arquiteturas modernas. Como plataforma experimental, serão utilizados processadores Intel, com AVX-512 e o processador vetorial NEC SX-Aurora TSUBASA. Será enfatizada a importância do processamento vetorial e de matrizes, presente em várias aplicações de inteligência artificial.

Autores:
Matheus da Silva Serpa (UFRGS), Félix Dal Pont Michels Júnior (UFRGS) e Philippe Olivier Alexandre Navaux (UFRGS).

Dia e horário: 20/04/2022, das 8 h 30 às 10 h 30.

Local: Lab. 1/2 da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h.

Nível: intermediário.

Pré-requisitos: o minicurso foi projetado para familiarizar os alunos com arquiteturas paralelas e vetoriais modernas e técnicas de programação, buscando introduzir os principais conceitos e melhores práticas de programação paralela.

Por ser um minicurso intermediário, deseja-se atender estudantes com um mínimo de formação (a partir do terceiro semestre de um curso na área da computação). É importante que o estudante tenha noções plenas de algoritmos e estruturas de dados elementares e que preferencialmente domine a linguagem C.

Conhecimentos sobre arquiteturas de computadores, sistemas operacionais, redes de computadores e sistemas distribuídos auxiliam para um maior aprendizado deste minicurso, e servem para entender aspectos conceituais mais difíceis de serem explicados. Por ser um curso extremamente prático, deseja-se que os estudantes tenham habilidade e prática na compilação e execução de códigos-fonte e executáveis.

Tópicos que serão abordados: este minicurso envolve o estudo de aspectos relacionados à arquitetura de computadores e a elaboração, execução e teste de programas paralelos. Nesse sentido, pretende-se inicialmente identificar as arquiteturas de hardware que existem atualmente, com foco nos processadores Intel com AVX-512 e no vetorial NEC SX-Aurora, e que podem ser utilizadas para a construção de aplicações de alto desempenho.

Em um segundo momento, a interface de programação paralela OpenMP será apresentada. Com base nela, almeja-se elaborar aplicações paralelas básicas e após, otimizar kernels de Machine Learning, ambos a serem executados nos processadores com paralelismo e vetorização. Além de programas criados durante o minicurso, também serão disponibilizados códigos fonte sequenciais, paralelos e vetorizados previamente criados e testados. Por fim, alguns tópicos de testes, depuração e medição de desempenho serão demonstrados, com o intuito de mostrar como são feitas avaliações de desempenho de aplicações paralelas nas plataformas alvo.

A estrutura do texto do minicurso é dividida em três partes:
    – Introdução
         – arquiteturas paralelas e vetoriais;
         – processadores Intel com AVX-512;
         – processador vetorial NEC SX-Aurora;
         – modelagem de aplicações paralelas.
    – Programação paralela e vetorial em OpenMP
         – primitivas do OpenMP;
         – paralelismo e vetorização de laços;
         – tratamento de condições de corrida.
    – Análise e otimização de desempenho de kernels de Machine Learning
         – introdução;
         – kernels de Machine Learning;
         – avaliação de desempenho;
         – técnicas de otimização.

Slides

A apresentação de resultados de experimentos que avaliam desempenho é uma etapa onipresente nas pesquisas de processamento de alto desempenho (PAD). Uma apresentação adequada é essencial para compreensão e reprodutibilidade dos resultados relatados. Tal etapa, entretanto, é frequentemente subestimada, sendo conduzida de maneira ad hoc, utilizando ferramentas inapropriadas e com pouca rastreabilidade, como por exemplo, editores de planilhas eletrônicas. Neste minicurso, apresentaremos uma abordagem baseada na linguagem R abrangendo desde o processamento dos dados brutos até a representação visual. A metodologia a ser apresentada explora os pacotes dplyr e ggplot2 para permitir que todas as transformações e manipulações aplicadas aos dados sejam documentadas e reprodutíveis. O minicurso será conduzido de forma prática, com exemplos e exercícios demonstrando cada um dos tópicos discutidos.

Autores:
Vinícius Garcia Pinto (FURG), Lucas Leandro Nesi (UFRGS) e Lucas Mello Schnorr (UFRGS).

Dia e horário: 20/04/2022, das 8 h 30 às 10 h 30.

Local: Lab. 5 da Informática.

Público-alvo: alunos de graduação e de pós-graduação, docentes, profissionais da área de TI.

Duração: 2 h.

Nível: básico.

Pré-requisitos: o participante deve ter domínio de lógica de programação e noções básicas de estatística. Noções básicas de paralelismo são desejáveis, como entendimento de computação paralela e concorrente, conhecimentos básicos de arquitetura como cores e threads. Não é necessário conhecimento prévio em linguagem R.

Tópicos que serão abordados:
   – Introdução à linguagem R
         – comandos básicos;
         – instalação de pacotes;
         – tipos básicos;
         – aritmética sobre vetores/matrizes.
   – Manipulação de resultados em texto puro (pacotes readr e dplyr)
        – leitura;
        – filtragem;
        – transformações;
        – derivações.
   – Construção de gráficos (pacotes ggplot2, patchwork e plotly)
       – gramática de gráficos;
       – gráficos básicos;
       – comparações com facetas;
       – composição de gráficos;
       – gráficos interativos.

Slides
Repositório do Gitlab