Programação Paralela em Arquiteturas Multi-Core/Ambientes de programação e bibliotecas: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 69:
 
O blocked_range construido aqui representa a iteração de entrada do espaço de 0 a n-1, do qual o parallel_for divide em subespaços para cada processador. A forma geral para o construtor blocked_range<T>(begin,end,grainsize). O T especifica o valor tipo. O argumento ''begin'' e ''end'' especifica o espaco de iteração STL-style como o intervalo (begin,end).
 
 
'''Grainsize'''
 
O terceiro argumento, ''grainsize'', especifica o número de iterações para um "tamanho razoavel" de pedaços (chunk) a ser tratado pelo processador. Se a iteração tem mais que ''grainsize'' iterações, parallel_for se divide em subintervalos separados que são agendados(scheduled) separadamente.
 
Linha 85 ⟶ 83:
Uma regra é que as iterações de grainsize em operator() deve ter no mínimo 10.000-100.000 instruções a serem computadas. Na duvida, faça o seguinte:
 
# Defina o maior parametro grainsize possivel. Definindo-o para 10.000 é usualmente uma bom ponto de partida, porque cada iteração do loop normalmente requer um minimo de instruções por iteração.
 
# Execute seu algoritmo em um processador.
 
# Comece reduzindo a metade o parametro ''grainsize'' e veja o quanto o algoritmo perde de desempenho quando esse valor diminui.
 
Um redução de desempenho de 5-10% quando estiver executando com uma única thread é uma boa margem na maioria dos casos. A devolução de definição de um ''grainsize'' é de 10.000 e o laço tem 20.000 iterações, o parallel_for distribui o laço entre somente dois processadores, sempre que tive mais disponíveis. Embora, se voce não tiver certeza, é bom "chutar" um valor um pouco mais alto do que mais baixo, porque valores muito baixos atingem o mesmo desempenho do serial.
 
'''Largura de Banda'''
Para um suficientemente simples função Foo, o exemplo pode não mostrar aumento de desempenho (speedup) significativo quando escrito como laço paralelo. A cause disso pode ser largura de banda insuficiente do sistema entre o processador e a memória. Nesse caso, você deve ter que repensar em seu algoritmo para ter um melhor vantagem de cache. Reestruturando melhor utilize os beneficios da cache para o programa paralelo bem como o programa serial.
 
'''Usando um Particionador'''
Uma caracteristica do TBB é suportar particionadores. Um particionado é um objeto que guia a escolher um tamanho para os pedaços. Duas classes de particionadores que você pode escolher são simple_partitioner e auto_partitioner.
 
Um simple_partitioner implementa um politica padrão. Esse padrão para o parallel_for, parallel_reduce. Um simples particionador tem as seguintes vantagens:
 
#
 
=== Desenvolvendo aplicações utilizando ''parallel_reduce'' ===