Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
IC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Harbor Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
clac16
IC
Commits
86fb89c3
Commit
86fb89c3
authored
3 months ago
by
clac16
Browse files
Options
Downloads
Patches
Plain Diff
Mudanças na análise do resumo
parent
285acb7f
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
texto/resumo/resumo-erad.tex
+71
-77
71 additions, 77 deletions
texto/resumo/resumo-erad.tex
with
71 additions
and
77 deletions
texto/resumo/resumo-erad.tex
+
71
−
77
View file @
86fb89c3
...
@@ -146,13 +146,7 @@ E, por default, ICC usa um modelo de ponto flutuante (\texttt{-fp-model=fast=1})
...
@@ -146,13 +146,7 @@ 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
que habilita otimizações que sacrificam a acurácia da aritmética, ao contrário
dos demais.
dos demais.
O comportamento default destes compiladores foi equiparado com a flag
O comportamento default destes compiladores foi equiparado com a flag
\texttt
{
-fp-model=precise
}
do ICC.
\footnote
\texttt
{
-fp-model=precise
}
do ICC.
{
A flag
\texttt
{
-fp-model=precise
}
desabilita otimizações que usam instruções
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
\%
.
}
\begin{table}
[h]
\begin{table}
[h]
\scriptsize
\scriptsize
...
@@ -179,98 +173,98 @@ têm problemas ao tentar utilizar extensões como AVX2.
...
@@ -179,98 +173,98 @@ têm problemas ao tentar utilizar extensões como AVX2.
\section
{
Análise dos códigos
}
\section
{
Análise dos códigos
}
Para investigar as causas das diferenças observadas, analisamos os código
Para investigar as causas das diferenças observadas, analisamos o código do
do programa particle-filter.
programa em que o compilador da Intel obteve maior vantagem, Particle Filter.
Foram escolhidos os códigos gerados com as flags
\texttt
{
-O3
}
e
O assembly foi gerado com as flags
\texttt
{
-O3
}
e
\texttt
{
-march=native
}
,
\texttt
{
-march=native
}
, além de
\texttt
{
-funroll-loops
}
com GCC e
além de
\texttt
{
-funroll-loops
}
com GCC e
\texttt
{
-fp-model=precise
}
com ICC.
\texttt
{
-fp-model=precise
}
com ICC.
Com estas flags, ICC mostrou um desempenho 42
\%
superior ao do GCC, que, por sua
vez, foi 24
\%
mais rápido que Clang e AOCC.
A Listagem~
\ref
{
list:pfilter.c.1
}
contém um segmento do programa.
A Listagem~
\ref
{
list:pfilter.c.1
}
contém um segmento de Particle Filter.
A seção que o inclui executa aproximadamente
\(
2
.
4
\)
vezes mais rápido no
Os quatro compiladores o vetorizam.
programa gerado pelo ICC do que no produzido pelo GCC, e cerca de
\(
1
.
4
\)
No entanto, GCC usa registradores de 128 bits (2 doubles), enquanto os
vezes mais rápido no GCC do que no Clang e AOCC.
demais usam registradores de 256 bits (4 doubles).
A cada iteração, GCC opera sobre 8 vetores (16 elementos) e AOCC, Clang e
ICC operam sobre 1 vetor (4 elementos).
\begin{lstlisting}
[label=list:pfilter.c.1,basicstyle=
\small
,
\begin{lstlisting}
[label=list:pfilter.c.1,basicstyle=
\small
,
caption=
{
Segmento de particle-filter (linhas 288--293)
}
]
caption=
{
Segmento de Particle Filter (linhas 445--447)
}
]
for(x = 0; x < lengthCDF; x++)
{
for(x = 0; x < Nparticles; x++)
{
if(CDF[x] >= value)
{
weights[x] = weights[x]/sumWeights;
index = x;
break;
}
}
}
\end{lstlisting}
\end{lstlisting}
AOCC e Clang geram, para este trecho, um código praticamente idêntico e
As observações feitas para a Listagem~
\ref
{
list:pfilter.c.1
}
se aplicam a
menos otimizado que os dos outros dois compiladores.
quase todo segmento de Particle Filter analisado.
GCC é o mais agressivo no loop unrolling e, ao vetorizar, sempre se limita ao
uso de registradores XMM, de 128 bits.
De acordo com o tamanho do laço, tipicamente é usado um fator de 4, 8 ou 16,
com o caso típico sendo 8 elementos ou, em código vetorizado, 8 vetores
(16 elementos).
Ao vetorizar o código, ICC geralmente opera sobre 1 vetor (4 elementos) por
iteração.
Mas em código não vetorizado, opera sobre 4 ou 8 elementos por iteração.
Clang e AOCC geram códigos bastante parecidos entre si e geralmente operam
sobre um único elemento ou vetor por iteração.
Seguindo o padrão observado, AOCC e Clang geram, para o segmento na
Listagem~
\ref
{
list:pfilter.c.2
}
, um código praticamente idêntico e sem loop
unrolling.
O laço principal consiste de 6 instruções, incluindo 1 leitura da memória,
O laço principal consiste de 6 instruções, incluindo 1 leitura da memória,
1 comparação ponto flutuante e 2 saltos condicionais.
1 comparação ponto flutuante e 2 saltos condicionais.
GCC otimiza o segmento com loop unrolling: o laço principal compara 8
Com GCC, o laço principal compara 8 elementos por iteração e consiste de 35
elementos por iteração e consiste de 35 instruções, incluindo 8 leituras da
instruções, incluindo 8 leituras da memória, 8 comparações ponto flutuante e 9
memória, 8 comparações ponto flutuante e 9
saltos condicionais.
saltos condicionais.
ICC vetoriza o fragmento.
ICC
é o único que
vetoriza o fragmento.
O laço principal realiza comparações e consiste de 12 instruções,
O laço principal realiza
16
comparações e consiste de 12 instruções,
incluindo 4 comparações de (vetores) ponto flutuante lidos da memória
incluindo 4 comparações de (vetores) ponto flutuante lidos da memória
e 2 saltos condicionais.
e 2 saltos condicionais.
A Listagem~
\ref
{
list:pfilter.c.2
}
contém outro segmento de particle-filter.
Os quatro compiladores foram capazes vetorizar este código.
No entanto, GCC usa registradores de 128 bits, enquanto os demais usam
registradores de 256 bits.
GCC realiza loop unrolling com fator 16, e AOCC e CLANG, 8.
ICC não realiza loop unrolling, copiando 4 elementos (um registrador
de 256 bits) por laço.
\begin{lstlisting}
[label=list:pfilter.c.2,basicstyle=
\small
,
\begin{lstlisting}
[label=list:pfilter.c.2,basicstyle=
\small
,
caption=
{
Segmento de
p
article
-f
ilter (linhas
499--504
)
}
]
caption=
{
Segmento de
P
article
F
ilter (linhas
288--293
)
}
]
for(x = 0; x <
Nparticles
; x++)
{
for(x = 0; x <
lengthCDF
; x++)
{
arrayX
[x] =
xj[x];
if(CDF
[x]
>
=
value)
{
arrayY[x] = yj[x]
;
index = x
;
weights[x] = 1/((double)(Nparticles))
;
break
;
}
}
\end{lstlisting}
O segmento na listagem~
\ref
{
list:pfilter.c.2
}
está dentro de um outro laço,
em que o valor de
\texttt
{
Nparticles
}
não muda.
Clang e AOCC computam a divisão de ponto flutuante
\texttt
{
1/Nparticles
}
cada vez que entram no laço interno.
Já GCC e ICC ambos tiram proveito do fato que o resultado não muda para
computá-lo uma única vez, no laço exterior: o código correspondente ao segmento
apenas carrega este valor.
Nenhum dos compiladores, no entanto, remove toda a atribuição da linha 4.
Outro trecho é apresentado na Listagem~
\ref
{
list:pfilter.c.3
}
.
Como no primeiro exemplo, apenas o ICC vetoriza o código.
Para tanto, o laço principal mantém quatro acumuladores em um registrador.
Ao sair do laço, o valor dos quatro acumuladores é somado.
Como no segundo exemplo, ICC não realiza loop unrolling.
Já o laço principal do GCC soma dezesseis elementos por iteração.
Clang e AOCC nem vetorizam nem realizam loop unrolling.
\begin{lstlisting}
[label=list:pfilter.c.3,caption=
{
Segmento de particle-filter (linhas 439--441)
}
]
for(x = 0; x < Nparticles; x++)
{
sumWeights += weights[x];
}
}
\end{lstlisting}
\end{lstlisting}
%O segmento na listagem~\ref{list:pfilter.c.2} está dentro de um outro laço,
%em que o valor de \texttt{Nparticles} não muda.
%Clang e AOCC computam a divisão de ponto flutuante \texttt{1/Nparticles}
%cada vez que entram no laço interno.
%Já GCC e ICC ambos tiram proveito do fato que o resultado não muda para
%computá-lo uma única vez, no laço exterior: o código correspondente ao segmento
%apenas carrega este valor.
%Nenhum dos compiladores, no entanto, remove toda a atribuição da linha 4.
O segmento na Listagem~
\ref
{
list:pfilter.c.2
}
é a principal parte da seção que
domina o tempo de execução do programa e que executa aproximadamente
\(
2
.
4
\)
vezes mais rápido no programa gerado pelo ICC do que no produzido pelo
GCC, e cerca de
\(
1
.
4
\)
vezes mais rápido no GCC do que no Clang e AOCC.
\section
{
Conclusão
}
\section
{
Conclusão
}
A análise
dos códigos
demonstra que o compilador da Intel identifica
A análise demonstra que o compilador da Intel identifica
possibilidades de
possibilidades de vetorização automática
que os outros compiladores ignoram.
vetorização
que os outros compiladores ignoram.
GCC, em especial, mesmo ao vetorizar um código, pode não ser capaz de utilizar
GCC, em especial, mesmo ao vetorizar um código, pode não ser capaz de utilizar
toda a largura dos registradores
, como visto para a
toda a largura dos registradores
.
Listagem~
\ref
{
list:pfilter.c.2
}
.
%como visto para a
Listagem~\ref{list:pfilter.c.2}.
De fato, como mostra a Tabela~
\ref
{
tab:resultados-medios
}
, ICC é o compilador
De fato, como mostra a Tabela~
\ref
{
tab:resultados-medios
}
, ICC é o compilador
mais afetado ao se desabilitar a vetorização automática, com sua performance
mais afetado ao se desabilitar a vetorização automática, com sua performance
média piorando em cerca de 4
\%
.
média piorando em cerca de 4
\%
.
A vantagem frente ao GCC é reduzida para cerca de 1
\%
.
A vantagem frente ao GCC é reduzida para cerca de 1
\%
.
Mas essa diferença não reflete totalmente o efeito da vetorização na performance
Mas a análise do código revela que, mesmo com a flag
\texttt
{
-no-vec
}
, ICC ainda
do ICC.
mantém vetorizações mais simples, incluindo a correspondentes ao segmento na
A análise do código revela que o código compilado com
\texttt
{
-no-vec
}
ainda
Listagem~
\ref
{
list:pfilter.c.1
}
, em que não apenas a vetorização é mantida, mas
mantém vetorizações mais simples, incluindo as correspondentes aos segmentos
o compilador passa a realizar loop unrolling para operar sobre dois vetores
na Listagem~
\ref
{
list:pfilter.c.2
}
e Listagem~
\ref
{
list:pfilter.c.3
}
, em que
(oito elementos) por iteração.
não apenas a vetorização é mantida, mas o compilador passa a realizar
Portanto, a variação de desempenho observada não reflete totalmente o efeito
loop unrolling para operar sobre oito elementos (dois vetores) por iteração.
da vetorização na performance do ICC.
Isto sugere que, enquanto várias diferenças nas estratégias de otimização afetam
o resultado, a principal vantagem do ICC é sua capacidade de vetorização.
\bibliographystyle
{
sbc
}
\bibliographystyle
{
sbc
}
\bibliography
{
resumo-erad
}
\bibliography
{
resumo-erad
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment