diff --git a/texto/resumo/resumo-erad.tex b/texto/resumo/resumo-erad.tex index 4496aa074725e677cd4e03cd6e6c4415fff7c8d6..85cf5cf56bbd868f3da49e069402c1206a1becd9 100644 --- a/texto/resumo/resumo-erad.tex +++ b/texto/resumo/resumo-erad.tex @@ -16,7 +16,17 @@ \author{Cristopher Carcereri \inst{1} \and Daniel Oliveira \inst{1}} -\address{Departamento de Informática -- Universidade Federal do Paraná (UFPR)} +\address{Departamento de Informática -- Universidade Federal do Paraná (UFPR) -- +Curitiba -- PR} + +%Caixa Postal 15.064 -- 91.501-970 -- Porto Alegre -- RS -- Brazil +%Blumenau, SC -- Brazil + +%Department of Computer Science -- University of Durham\\ +%Durham, U.K. + +%Departamento de Sistemas e Computação\\ +%Universidade Regional de Blumenal (FURB) -- Blumenau, SC -- Brazil \begin{document} @@ -30,8 +40,8 @@ investigar suas causas. São testados os compiladores AOCC, Clang, GCC e ICC. A comparação mostra que o compilador da Intel apresenta uma vantagem - significativa que se deve principalmente a sua capacidade de vetorizar o - código automaticamente. + significativa, devida principalmente à sua capacidade de vetorizar o código + automaticamente. \end{resumo} \section{Introdução} @@ -39,7 +49,7 @@ Com aplicações de alta performance escritas em linguagens de alto nível, a eficiência do código produzido pelo compilador é um fator importante para o uso de recursos e velocidade de processamento atingida. - +% %Embora compiladores compartilhem muitas estratégias de otimização básicas, há %distinção em melhorias específicas, focadas na arquitetura ou implementação, que %podem resultar em variações significativas de desempenho. @@ -47,53 +57,53 @@ de recursos e velocidade de processamento atingida. %profusão de instruções de arquiteturas x86-64 modernas, com extensões como SSE e %AVX2. -Entender as diferenças de performance entre os códigos gerados é importante +Entender as diferenças de desempenho entre os códigos gerados é importante tanto para programadores e pesquisadores maximizarem a performance de uma aplicação em uma plataforma de hardware particular, quanto para desenvolvedores de compiladores identificarem oportunidades de melhorar seu produto. -Este estudo busca explorar o impacto de quatro compiladores C/C++ -amplamente usados --- GCC (GNU Compiler Collection), Clang, AOCC (AMD Optimizing -C/C++ Compiler) e ICC (Intel oneAPI DPC++/C++ Compiler) --- no desempenho -de aplicações científicas, usando um conjunto abrangente de benchmarks. -Além de quantificar diferenças no tempo de execução, buscamos investigar as -causas das disparidades observadas. +Este estudo explora o impacto de quatro compiladores C/C++ amplamente usados --- +GCC (GNU Compiler Collection), Clang, AOCC (AMD Optimizing C/C++ Compiler) e ICC +(Intel oneAPI DPC++/C++ Compiler) --- no desempenho de aplicações científicas +usando um conjunto abrangente de benchmarks. +Além de quantificar o tempo de execução, nos propomos a investigar as causas das +disparidades observadas. %\cite{kasliwal2017} compara a performance de seis compiladores %C/C++ para Intel Xeon Platinum baseado na arquitetura Skylake usando três %kernels pararelizados com OpenMP. -\cite{davis2021} testou seis compiladores usando cinco aplicações -em sistemas heterogêneos com GPUs Nvidia V100. +\cite{davis2021} testou seis compiladores usando cinco aplicações em sistemas +heterogêneos com GPUs Nvidia V100. Com a maior parte dos compiladores foi empregado OpenMP para o GPU offload, mas -OpenACC e CUDA também foram utilizados . -\cite{halbiniak2022} examina cinco compiladores para -processadores AMD EPYC Rome usando duas implementações, paralelizadas com OpenMP, -de modelagem numérica da solidificação de ligas. +OpenACC e CUDA também foram utilizados. +\cite{halbiniak2022} examina cinco compiladores para processadores AMD EPYC Rome +usando duas implementações, paralelizadas com OpenMP, de modelagem numérica da +solidificação de ligas. Nos dois casos, a avaliação mostrou que o desempenho dos compiladores varia substancialmente. \section{Os testes} Para comparar a performance, foi adotado o conjunto de benchmarks Rodinia -(versão 3.1), que pode ser facilmente obtido e testado e que implementa uma -variedade de programas paralelos úteis para aplicações científicas -\cite{che2009rodinia}. +(versão 3.1), que é fácil de obter e implementa uma variedade de programas +paralelos úteis para aplicações científicas \cite{che2009rodinia}. Para os testes, foram selecionados 17 (de um total de 19) implementações usando a API OpenMP.\footnote {O programa MUMmerGPU foi excluído porque emprega, também, CUDA, não suportado pelas versões mais recentes dos compiladores. -O programa lud mostrou uma imensa sensibilidade ao compilador e as flags, então -teria um impacto desproporcional na performance média. -A razão entre o maior e menor tempo de execução para lud é cerca de \(17.5\). -Dentre os demais programas, a maior razão é \(3.3\), e a média (aritmética) -das razões é \(1.7\). +Já LU Decomposition mostrou uma imensa sensibilidade ao compilador e as flags, +então teria um impacto desproporcional na performance média. +%A razão entre o maior e menor tempo de execução obtidos para ele é cerca de +%\(17.5\). +%Dentre os demais programas, a maior razão é \(3.3\), e a média (aritmética) +%das razões é \(1.7\). } Foram feitas algumas modificações à versão original do Rodinia. Em especial, os makefiles foram alterados para simplificar a compilação com diferentes parâmetros e, para reduzir o impacto de I/O na aferição, a saída dos programas foi direcionada para \texttt{/dev/null}. -Os benchmarks modificados e os scripts usados para teste estão disponíveis -em \url{foo.bar}. +Os benchmarks modificados e os scripts usados para teste, assim como os +resultados completos, estão disponíveis em \url{foo.bar}. %\subsection{Compiladores testados} @@ -131,20 +141,19 @@ em C e as flags que habilitam OpenMP (\texttt{-qopenmp} com ICC, As diferenças nas flags selecionadas visam compensar variações entre as flags definidas para compiladores. -Com AOCC, Clang e ICC \texttt{O3} implica loop unrolling, mas não com GCC. +Com AOCC, Clang e ICC \texttt{-O3} implica loop unrolling, mas não com GCC. E, por default, ICC usa um modelo de ponto flutuante (\texttt{-fp-model=fast=1}) que habilita otimizações que sacrificam a acurácia da aritmética, ao contrário dos demais. O comportamento default destes compiladores foi equiparado com a flag \texttt{-fp-model=precise} do ICC.\footnote {A flag \texttt{-fp-model=precise} desabilita otimizações que usam instruções -fma. +FMA. Enquanto isso é uma desvantagem para o ICC, reduzindo o ganho com \texttt{-march=native}, a diferença provavelmente é pouco significativa: -com os demais compiladores, o impacto de instruções fma é inferior a 1\%. +com os demais compiladores, o impacto de instruções FMA é inferior a 1\%. } - \begin{table}[h] \scriptsize \centering @@ -157,10 +166,9 @@ com os demais compiladores, o impacto de instruções fma é inferior a 1\%. \caption{Tempos de execução médios para diferentes parâmetros de compilação} \label{tab:resultados-medios} \end{table} -%Reordenar linhas da tabela? O compilador da Intel obteve o maior desempenho. -Comporando o melhor caso da tabela para cada compilador, ICC superou o GCC em +Comparando o melhor caso na tabela para cada compilador, ICC superou o GCC em cerca de 5\%, e GCC superou o Clang em cerca de 4\%. Para todos os conjuntos de flags testados, a performance média do Clang supera a do AOCC entre 1\% e 3\%.