Granularidade (computação paralela) - Granularity (parallel computing)
Na computação paralela , a granularidade (ou tamanho do grão ) de uma tarefa é uma medida da quantidade de trabalho (ou computação) que é executada por aquela tarefa.
Outra definição de granularidade leva em consideração a sobrecarga de comunicação entre vários processadores ou elementos de processamento. Ele define granularidade como a razão entre o tempo de computação e o tempo de comunicação, em que, o tempo de computação é o tempo necessário para realizar o cálculo de uma tarefa e o tempo de comunicação é o tempo necessário para trocar dados entre os processadores.
Se for o tempo de computação e denotar o tempo de comunicação, então a Granularidade G de uma tarefa pode ser calculada como:
A granularidade é geralmente medida em termos do número de instruções executadas em uma tarefa específica. Como alternativa, a granularidade também pode ser especificada em termos do tempo de execução de um programa, combinando o tempo de computação e o tempo de comunicação.
Tipos de paralelismo
Dependendo da quantidade de trabalho executada por uma tarefa paralela, o paralelismo pode ser classificado em três categorias: paralelismo de baixa granulação, de granulação média e de granulação grossa.
Paralelismo refinado
No paralelismo refinado, um programa é dividido em um grande número de pequenas tarefas. Essas tarefas são atribuídas individualmente a vários processadores. A quantidade de trabalho associada a uma tarefa paralela é baixa e o trabalho é distribuído uniformemente entre os processadores. Conseqüentemente, o paralelismo refinado facilita o balanceamento de carga .
Como cada tarefa processa menos dados, o número de processadores necessários para realizar o processamento completo é alto. Isso, por sua vez, aumenta a sobrecarga de comunicação e sincronização.
O paralelismo refinado é mais bem explorado em arquiteturas que suportam comunicação rápida. A arquitetura de memória compartilhada com baixo overhead de comunicação é mais adequada para paralelismo de baixa granularidade.
É difícil para os programadores detectar o paralelismo em um programa, portanto, geralmente é responsabilidade dos compiladores detectar o paralelismo refinado.
Um exemplo de sistema de baixa granularidade (de fora do domínio da computação paralela) é o sistema de neurônios em nosso cérebro .
Connection Machine (CM-2) e J-Machine são exemplos de computadores paralelos de grão fino que têm tamanho de grão na faixa de 4-5 μs.
Paralelismo de granulação grossa
No paralelismo de baixa granularidade, um programa é dividido em grandes tarefas. Devido a isso, uma grande quantidade de computação ocorre nos processadores. Isso pode resultar em desequilíbrio de carga, em que certas tarefas processam a maior parte dos dados enquanto outras podem ficar ociosas. Além disso, o paralelismo de baixa granulação falha em explorar o paralelismo no programa, pois a maior parte da computação é realizada sequencialmente em um processador. A vantagem desse tipo de paralelismo é a baixa sobrecarga de comunicação e sincronização.
A arquitetura de passagem de mensagens leva muito tempo para comunicar dados entre processos, o que a torna adequada para paralelismo de granulação grossa.
Cray Y-MP é um exemplo de computador paralelo de granulação grossa que possui um tamanho de granulação de cerca de 20s.
Paralelismo de granulação média
O paralelismo de granulação média é usado em relação ao paralelismo de granulação fina e granulação grossa. O paralelismo de granulação média é um meio-termo entre o paralelismo de granulação fina e o paralelismo de granulação grossa, em que temos o tamanho da tarefa e o tempo de comunicação maior que o paralelismo de granulação fina e menor que o paralelismo de granulação grossa. A maioria dos computadores paralelos de uso geral se enquadra nesta categoria.
Intel iPSC é um exemplo de computador paralelo de granulação média com tamanho de granulação de cerca de 10 ms.
Exemplo
Considere uma imagem 10 * 10 que precisa ser processada, visto que o processamento dos 100 pixels é independente um do outro.
Paralelismo refinado: suponha que haja 100 processadores responsáveis pelo processamento da imagem 10 * 10. Ignorando o overhead de comunicação, os 100 processadores podem processar a imagem 10 * 10 em 1 ciclo de clock. Cada processador está trabalhando em 1 pixel da imagem e então comunica a saída para outros processadores. Este é um exemplo de paralelismo refinado.
Paralelismo de granulação média: considere que há 25 processadores processando a imagem 10 * 10. O processamento da imagem agora levará 4 ciclos de clock. Este é um exemplo de paralelismo de granulação média.
Paralelismo de granulação grossa: Além disso, se reduzirmos os processadores para 2, o processamento levará 50 ciclos de clock. Cada processador precisa processar 50 elementos, o que aumenta o tempo de computação, mas a sobrecarga de comunicação diminui à medida que o número de processadores que compartilham dados diminui. Este caso ilustra o paralelismo de granulação grossa.
Grão fino: Pseudocódigo para 100 processadores | Grão médio: Pseudocódigo para 25 processadores | Grão grosso: Pseudocódigo para 2 processadores |
---|---|---|
void main()
{
switch (Processor_ID)
{
case 1: Compute element 1; break;
case 2: Compute element 2; break;
case 3: Compute element 3; break;
.
.
.
.
case 100: Compute element 100;
break;
}
}
|
void main()
{
switch (Processor_ID)
{
case 1: Compute elements 1-4; break;
case 2: Compute elements 5-8; break;
case 3: Compute elements 9-12; break;
.
.
case 25: Compute elements 97-100;
break;
}
}
|
void main()
{
switch (Processor_ID)
{
case 1: Compute elements 1-50;
break;
case 2: Compute elements 51-100;
break;
}
}
|
Tempo de computação - 1 ciclo de clock | Tempo de computação - 4 ciclos de clock | Tempo de computação - 50 ciclos de clock |
Níveis de paralelismo
A granularidade está intimamente ligada ao nível de processamento. Um programa pode ser dividido em 4 níveis de paralelismo -
- Nível de instrução.
- Nível de loop
- Nível de sub-rotina e
- Nível de programa
A maior quantidade de paralelismo é alcançada no nível de instrução , seguido pelo paralelismo em nível de loop . No nível de instrução e loop, o paralelismo refinado é alcançado. O tamanho de grão típico no nível de instrução é de 20 instruções, enquanto o tamanho de grão no nível de loop é de 500 instruções.
No nível da sub-rotina (ou procedimento), o tamanho do grão é normalmente de alguns milhares de instruções. O paralelismo de granulação média é alcançado no nível de sub-rotina.
No nível do programa , a execução paralela de programas ocorre. A granularidade pode estar na faixa de dezenas de milhares de instruções. O paralelismo de granulação grossa é usado neste nível.
A tabela abaixo mostra a relação entre os níveis de paralelismo, tamanho do grão e grau de paralelismo
Níveis | Tamanho de grão | Paralelismo |
---|---|---|
Nível de instrução | Multar | Altíssima |
Nível de loop | Multar | Moderado |
Nível de sub-rotina | Médio | Moderado |
Nível do programa | Grosso | Ao menos |
Impacto da granularidade no desempenho
A granularidade afeta o desempenho de computadores paralelos. Usar grãos finos ou pequenas tarefas resulta em mais paralelismo e, portanto, aumenta a velocidade . No entanto, sobrecarga de sincronização, estratégias de agendamento , etc., podem impactar negativamente o desempenho de tarefas de baixa granularidade. Aumentar o paralelismo sozinho não pode fornecer o melhor desempenho.
Para reduzir a sobrecarga de comunicação, a granularidade pode ser aumentada. Tarefas de granulação grossa têm menos sobrecarga de comunicação, mas costumam causar desequilíbrio de carga. Conseqüentemente, o desempenho ideal é alcançado entre os dois extremos de paralelismo de granulação fina e de granulação grossa.
Vários estudos propuseram sua solução para ajudar a determinar a melhor granularidade para auxiliar o processamento paralelo. Encontrar o melhor tamanho de grão depende de vários fatores e varia muito de problema para problema.