Benchmarks

Transcrição

Benchmarks
Benchmarks
1. Introdução
Um Benchmark é um programa de teste de desempenho que analisa as
características de processamento e de movimentação de dados de um sistema de
computação com o objetivo de medir ou prever seu desempenho e relevar os pontos
fortes e fracos de sua arquitetura. Benchmarks podem ser classificados de acordo com a
classe de aplicação para a qual são voltados como, por exemplo, computação científica,
serviços de rede, aplicações multimídia, processamento de sinais entre outros. Neste
trabalho utilizaremos os seguintes benchmarks Whetstone, Dhrystone e o Linpack o
cluster analisado foi o h3p do núcleo de pesquisa do G3PD UCPeL no qual possui 8
núcleos sendo os nodos h3,h4,h5,h6,h7 e h9 Athlon XP 2400 com o clock interno de
2,0 GHz clock externo 266 MHz com 256MB de RAM, os nodos h3p e h8 Semprom
2400 clock interno de 1,67 GHz clock externo 333 MHz com 256MB de RAM.
2.
Whetstone
O Whetstone foi o primeiro benchmark sintético na literatura, com fins específicos
de medida de desempenho. Sua primeira versão foi publicada na linguagem ALGOL 60
( apesar de ter sido mais utilizado em FORTRAN), em 1976, por H.J. Curnow e B. A.
Wichmann, do Laboratório Nacional de Física na Inglaterra.
O Whetstone é um programa com poucas linhas de código, composto de vários
módulos. Cada módulo tem um tipo diferente, explora diferentes características da
linguagem de programação e é executado várias vezes através de loops “FOR”.
As vantagens deste benchmark são o seu tamanho reduzido e simplicidade no
código, além de explorar bastante as operações em ponto-flutuante. Portanto, serve
como comparativo para pequenos aplicações científicas em computadores de pequeno e
médio porte.
Algumas vezes, para fins comerciais, o programa sofre pequenas alterações como
retirada dos comandos de impressão, o que pode eliminar partes importantes do código.
Para tentar resolver estes tipos de problemas, em 1988, uma nova versão em Pascal foi
publicada.
O problema com o Whetstone é que só há uma versão oficial, em Pascal. Além
disso, a performance medida por este programa depende principalmente da velocidade
das funções matemáticas (seno, cosseno, raiz quadrada, etc.).
Os resultados obtidos com a aplicação do benchmark Whetstone em alguns nodos
do Cluster pode ser visto na Figura 1, onde as variáveis utilizadas são: “loop”, que
indica o número de repetições do laço, “Iterations” que representa o número de
execuções do programa, “Time” , apresenta o tempo de duração do teste, e por final é
apresentado o resultado em MIPS (milhões de instruções por segundo).
Após a execução dos testes nos diferentes nodos pode-se notar que os nodos com
processador Athlon obtiveram resultados superiores aos com processadores Semprom.
Figura 1 – Resultados Whetstone
3. Drystone
Este é um benchmark simples para medir o desempenho do processador em inteiros,
desenvolvido em 1984. O programa simula chamadas de sistema e operações de leitura
e escrita de dados. Vários programas de benchmark atuais entre eles o Sisoft Sandra
trazem este benchmark como um dos testes. O resultado indica o número de vezes por
segundo que o processador é capaz de executar o conjunto de instruções.
Como os processadores atuais são capazes de executar várias instruções por ciclo e
dependem muito da velocidade e quantidade de cache, o desempenho varia muito de
acordo com o aplicativo. Por isso, o resultado obtido pelo processador no Dhrystone
serve apenas como uma referência de desempenho bruto, que não indica
necessariamente o desempenho do processador em aplicativos reais.
Entretanto, algumas das vantagens aparentes do Dhrystone também são fraquezas
significativas do mesmo. Os números do Dhrystone refletem na verdade o desempenho
do compilador da linguagem C e suas bibliotecas, provavelmente mais do que o
desempenho do próprio processador. Além disso, seu projeto foi baseado na análise de
vários outros programas, escritos em diferentes linguagens e por diferentes autores,
porém, voltados à programação de sistemas (sistemas operacionais, compiladores, etc.).
Esta é uma característica bastante relevante, pois, diferentes classes de aplicações
enfatizam diferentes tipos de operações, como por exemplo, aplicações numéricas
utilizam bastante vetores e aritmética de ponto-flutuante; aplicações comerciais utilizam
predominantemente atividades de entrada/saída; e programação de sistemas utiliza
bastante ponteiros, sentenças "IF ", chamadas de procedimentos, além de conter menos
laços e expressões numéricas mais simples.
Os resultados obtidos são apresentados na Figura 2 e Figura 3, onde o benchmark
foi executado nos nodos h7 e h8 respectivamente. Os testes envolvidos neste benchmark
são: testes aritméticos, testes de overhead, leitura/escrita de arquivos, entre outros.
Ao final destes testes é apresentado um resumo dos resultados obtidos, onde temos
uma variável “Baseline”, que possui um valor fixo pré-definido afim de atribuir um
peso diferente para cada um dos testes executados e uma variável “Result” no qual
apresenta o número de repetições executados durante os testes, na última coluna, está a
variável “Index” a qual é a variável utilizada para apresentar os resultados gerais mais
simplificadamente, tornando possível a comparação entre diferentes máquinas com
maior facilidade.
Figura 2 – Dhrystone nodo h7
Figura 3 – Dhrystone nodo H8
4. Linpack
O Linpack é um dos mais famosos benchmarks atualmente, utilizado nos testes das
500 máquinas mais rápidas (Top500). O Linpack foi desenvolvido por Jack Dongarra e
é para a solução de um sistema de equações lineares denso. O Limpack é utilizado para
o Top500 pois é amplamente difundido e apresenta versões para os mais relevantes
sistemas.
Para o Top500 é utilizado uma versão que permite ao usuário alterar a escala do
problema é otimizar o software a fim de conseguir um melhor desempenho total em um
determinado sistema. O desempenho não reflete, perfeitamente o desempenho total do
sistema, entretanto, como este problema é muito regular, o desempenho obtido é
elevado e números obtidos dão uma boa aproximação do desempenho de pico do
sistema.
As duas características do Limpack são a referenciação de duas rotinas : DGEFA
e DGESL (estas são rotina que trabalha com ponto flutuante de 64 bits; já as SGEFA e
SGESL trabalham normalmente com expressões de ponto flutuante de 32 bits). DGEFA
realiza a decodificação parcial do vetor, e DGESL usa esse tipo de decodificação para
resolver um determinado sistema de equações lineares. A maior parte das execuções de
ponto flutuante gira em torno de O(n³), este é o tempo gasto em DGEFA. Uma vez que
a matriz foi decomposta usando o DGESL, que trabalha com tempo de O(n²) operações
de ponto flutuante. Por sua vez DGEFA e DGESL chamam três rotinas que são:
DAXPY, IDAMAX, DSCAL. Usando uma proporção de tempo a rotina DAXPY
consome 90% do tempo de execução, sua função esta voltada na multiplicação de um
escalar α * vetor X, e adicionar os resultados em outro vetor Y. Esta rotina é chamada
aproximadamente n²/2 vezes por DGEFA e 2n vezes por DGESL utilizando vetores de
comprimento variável. A declaração yi←yi+α.xi, que constitui um elemento da
DAXPY é executado aproximadamente n³/3+n² vezes o que dá origem a cerca de 2/3n³
operações de ponto flutuante. Assim a referência n=100 requer cerca de 2/3 milhões de
operações de ponto flutuante. A declaração yi←yi+α.xi, além do ponto flutuante de
adição e multiplicação, envolve algumas operações de armazenamento e referências.
Enquanto o linpack envolve as rotinas DGEFA e DGESL que referenciam vetores
bidimensionais. Uma vez que se diga que o Fortran possui vetores bidimensionais seria
armazenado por colunas na memória, o acesso a elementos consecutivos de uma coluna
conduz a cálculos de índice simples. As referências a elementos consecutivos são
diferenciados por uma palavra, em vez de pela primeira indexação do vetor
bidimensional.
Os testes de benchmark foram realizados nos nodos h7 e h8 separadamente
conforme pode ser visto nas figuras 4 e 5.
Para realizar o teste deve-se entrar com o tamanho do array que pode ser no
máximo 200. Nos teste apresentados usou-se matrizes de 200x200 e 100x100.
As variáveis apresentadas no teste são “Reps” indica o número de repetições,
“Time´s” indica o tempo de execução, “DGEFA” indica a porcentagem de tempo gasto
com essa rotina, “DGESL” indica a porcentagem de tempo gasto com essa rotina,
“OVERHEAD” indica a porcentagem de tempo gasto com overhead, “KFLOPS” indica
o numero de operações por segundo realizadas.
Figura 4 – Linpack nodo H7
Figura 5 – Linpack nodo H8