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