Avaliação do potencial de Tasks com dependências de dados em OMPSS na otimização da simulação de partículas em células

Apesar das grandes promessas do paradigma baseado em tasks, oferecido por modelos de programação paralela como o OpenMP e o OmpSs, as suas vantagens efetivas estão longe de ser…

Apesar das grandes promessas do paradigma baseado em tasks, oferecido por modelos de programação paralela como o OpenMP e o OmpSs, as suas vantagens efetivas estão longe de ser bem compreendidas quando aplicadas a programas não triviais que envolvem a computação de alto desempenho utilizados em aplicações do mundo real.

No contexto do projeto EPEEC, uma colaboração entre equipas do INESC-ID e do BSC (Barcelona Supercomputer Center) tem contribuído para uma melhor avaliação das vantagens e limitações das tasks com dependências de dados quando usadas para paralelizar a importante classe de aplicações de malha de partículas. O caso utilizado para este estudo foi uma simulação cinética da física de plasmas, baseada num método eletromagnético de partículas em célula (do inglês, EM-PIC). Este método é amplamente utilizado para modelar muitos cenários relevantes da física dos plasmas, desde a interação laser-plasma de alta intensidade a choques astrofísicos.

Diferentes implementações baseadas em tasks de uma versão básica do código OSIRIS EM-PIC, chamado ZPIC, foram desenvolvidas sobre o modelo de programação OmpSs-2. As diferentes versões exploram o paradigma baseado em tasks utilizando diferentes implementações – desde as abordagens mais tradicionais com tasks até à utilização das mais avançada técnicas disponíveis com dependências de dados. O conjunto de implementações paralelas está público como código-fonte aberto no repositório Github do EPEEC: : https://github.com/epeec/zpic-epeec.

Estas implementações foram avaliadas experimentalmente com instâncias realistas (nomeadamente, Laser Wakefield Accelerator e Collision of Plasma Clouds), realizadas num nó computacional composto por dois CPUs Intel Xeon Platinum 8160 @2.10 GHz com 24 núcleos físicos cada (total de 48 núcleos) e 96 GB de RAM, correndo SUSE Linux. Os resultados obtidos mostram que uma implementação totalmente assíncrona (ou seja, usando apenas dependências de dados para sincronização) é capaz de atingir um escalamento quase perfeito para 48 núcleos, apesar do desbalanceamento de carga das instâncias. Este resultado assinalável foi conseguindo mantendo níveis semelhantes de simplicidade do código baseado em tasks.