• Nenhum resultado encontrado

4.2 EXPERIMENTOS COM MINI-APLICAÇÕES CIENTíFICAS

4.2.1 N-Body

A simulação de N-Body calcula a evolução de um sistema de corpos (ou partículas) que interagem entre si. Estas interações ocorrem em razão da influência que um corpo exerce sobre os outros, considerando para isso variáveis como distância e aceleração. A evolução se dá pela mudança na posição de cada corpo, que é definida pelas coordenadas X, Y e Z.

A versão utilizada nestes experimentos foi adaptada da disponível no repositório do Barcelona Supercomputing Center4. Nesta adaptação, as posições dos corpos são calculadas a partir de dois vetores, sendo um de entrada e um de saída. Isto resulta na necessidade de alteração no particionamento de dados dos vetores ao fim de cada iteração, pois apenas o vetor de saída é divido em blocos e é preciso inverter os vetores após finalizar uma iteração. Mais detalhes sobre esta implementação estão disponíveis no apêndice B (página 85).

Escalabilidade

A Figura 4.2 exibe os resultados obtidos para os cinco back-ends do primeiro experi- mento com a N-Body. Nela é possível observar que a aplicação escalou para todos os back- endsquando foram empregadas apenas CPUs para o processamento. Neste cenário, o melhor desempenho foi obtido nas execuções com o Kaapi (aceleração de 24,4 com 28 threads). Os back-endsOpenMP e StarPU alcançaram speedup com 28 threads de 21,4 e 20,6, respectiva- mente. No entanto, em ambas versões ocorreu uma estabilização nos ganhos entre 16 e 22 e entre 24 e 28 threads. Já as execuções com StarPU+OpenMP e StarPU+Kaapi ficaram abaixo das demais, atingindo acelerações máximas de 16,7 e 18,8 também com 28 threads.

Nas execuções com somente GPUs (0 thread) percebem-se ganhos, com speedup de 7,4 com 1 GPU e de 29,7 com 4 GPUs. Combinando GPUs e CPUs, os melhores resultados foram alcançados com o back-end StarPU, sendo que a aceleração máxima foi obtida combinando 3 GPUs com 24 threads (40,9). Este valor foi semelhante ao registrado com 4 GPUs entre 16 e 22 threads, o que leva a percepção de um saturamento na combinação de CPUs com 4 GPUs. Saturamento também ocorreu com 1 GPU a partir de 16 threads. Há ainda uma queda de desempenho com 28, 26 e 24 threads para 2, 3 e 4 GPUs, nesta ordem.

Os experimentos combinando StarPU+OpenMP e StarPU+Kaapi também resultaram em ganhos, no entanto, eles foram menores que os obtidos apenas com StarPU. Com StarPU+ OpenMP ocorreu uma parada no crescimento do speedup entre 10 e 12 threads. A aceleração

Figura 4.2 – N-Body: escalabilidade variando GPUs e threads. Partículas: 98.304. Bloco: 2.048. Iterações: 5. ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0 GPU (apenas CPUs) 1 GPU + CPUs 2 GPUs + CPUs

3 GPUs + CPUs 4 GPUs + CPUs

0 10 20 30 40 0 10 20 30 40 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 Threads Speedup

Back−ends: ● Kaapi OpenMP StarPU StarPU+Kaapi StarPU+OpenMP

Fonte: Próprio autor.

máxima com StarPU+OpenMP foi de 32,7 (4GPUs+8CPUs). Já com StarPU+Kaapi, o máximo foi de 40,2 (4GPUs+28CPUs), onde aconteceram picos para 3 e 4 GPUs com 28 threads.

Máxima configuração

O segundo experimento com a aplicação N-Body considerou a configuração máxima permitida pela plataforma variando-se os tamanhos da entrada. A Figura 4.3 exibe os resultados obtidos. Em seu primeiro quadro onde utilizou-se somente CPUs, constatou-se que os ganhos com os back-ends Kaapi, StarPU+OpenMP e StarPU+Kaapi permanecem praticamente estáveis para as diferentes entradas. Todavia, variações ocorreram para as versões OpenMP e StarPU. Os piores desempenhos foram computados com entrada de 65.536 partículas com speedup de 13,7 (StarPU) e 14,3 (OpenMP), enquanto que os melhores aconteceram para a entrada de 114.688 partículas com acelerações de 24,0 (StarPU) e 24,9 (OpenMP). As diferenças entre os piores e melhores giram em torno de 43%.

Figura 4.3 – N-Body: máxima configuração variando o tamanho da entrada. Bloco: 2.048. Iterações: 5.

● ● ● ● ●

0 GPU (apenas CPUs) 1 GPU + CPUs 2 GPUs + CPUs

3 GPUs + CPUs 4 GPUs + CPUs

0 10 20 30 40 50 0 10 20 30 40 50 65536 81920 98304 114688 131072 65536 81920 98304 114688 131072 65536 81920 98304 114688 131072 65536 81920 98304 114688 131072 65536 81920 98304 114688 131072 Número de partículas Speedup

Back−ends: ● Kaapi OpenMP StarPU StarPU_GPU StarPU+Kaapi StarPU+OpenMP

Fonte: Próprio autor.

GPUs (série StarPU_GPU), percebe-se que os ganhos de aceleração mantiveram-se constantes para todas as entradas. Isto também ocorreu para as combinações de GPUs+CPUs com os back-endsStarPU+OpenMP e StarPU+Kaapi, onde houve variações somente para a entrada de 98.304 com perdas da versão StarPU+OpenMP em relação a StarPU+Kaapi. Nas execuções com StarPU combinando GPUs+CPUs os ganhos foram superiores aos com somente GPUs. A exceção é para 4 GPUs e entrada de 65.536, onde houve uma ligeira perda de 4,08% (de 29,4 para 28,2).

Escalabilidade por bloco (StarPU)

O experimento de melhor configuração que viria na sequência do máxima configuração não precisou ser realizado para o N-Boby, pois as configurações máximas resultaram nos me- lhores desempenhos. Desta forma, o próximo e último experimento com a presente aplicação é o de escalabilidade com diferentes tamanhos de blocos. Os resultados obtidos estão expostos na Figura 4.4.

Figura 4.4 – N-Body: escalabilidade variando o tamanho do bloco com os back-ends da runtime StarPU. Partículas: 98.304. Blocos: 2.048 e 4.096. Iterações: 5.

● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0 GPU (apenas CPUs) 1 GPU + CPUs 2 GPUs + CPUs

3 GPUs + CPUs 4 GPUs + CPUs

0 10 20 30 40 50 60 70 0 10 20 30 40 50 60 70 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 0 4 8 12 16 20 24 28 Threads Speedup Back−ends: ● StarPU(2048) StarPU(4096) StarPU+Kaapi(2048) StarPU+Kaapi(4096) StarPU+OpenMP(2048) StarPU+OpenMP(4096)

Fonte: Próprio autor.

Levando-se em conta somente CPUs, as variantes StarPU+OpenMP e StarPU+Kaapi melhoraram seus resultados com o bloco maior, enquanto a StarPU permaneceu estável. Esta melhora foi de 16,77% para StarPU+OpenMP e de 5,85% para StarPU+Kaapi.

Nas execuções apenas com GPUs (0 thread), percebe-se que os ganhos com bloco de 4.096 foram maiores para todas as versões. Todavia, é possível observar a ocorrência de uma estabilização no desempenho com o bloco de 4.096 na combinação de GPUs+threads com o back-end StarPU. Os back-ends StarPU+OpenMP e StarPU+Kaapi melhoraram a aceleração com o grão maior (4.096) e superaram a versão StarPU. Com a variante StarPU+Kaapi obteve-se o melhor desempenho com o bloco de 4.096, uma aceleração de 68,0 para 4GPUs+16CPUs. Já com a versão StarPU+OpenMP aconteceram quedas que interromperam os ganhos no intervalo de 10 a 12 CPUs.

Documentos relacionados