Questão Essa falta de aceleração está relacionada ao processador ou ao código?


Eu escrevi um programa que usa MPI, ele resolve um sistema muito grande de equações. Estou obtendo ótimas "acelerações" para sistemas muito grandes. O que quero dizer com isso é que, se eu aumentar o número de processos, o tempo que leva para completar as metades, além de um tempo constante adicionado a isso, que considero comunicação. Por exemplo, em um processo, pode levar 60s, depois dois, pode levar 35s (60 + 5), e em 4, 20.5 (17,5 + 3) etc.

No entanto, ao entrar em sistemas que são aproximadamente 1 milhão por 1 milhão, eu começo a obter resultados estranhos. Ao passar de 4 núcleos para 8 núcleos, recebo metade do tempo mais 10 segundos de "comunicação". Ou seja, o tempo que leva para concluir o cálculo vai de ~ 260 a ~ 140.

Isso é bom, mas quando vai de 8 a 16 o tempo passa de ~ 140 a ~ 110, eu também obtenho um resultado pobre muito similar quando estou indo de 16 a 32. Ou seja, ~ 110 a ~ 85.

Eu acho que isso pode ter algo a ver com o processador em si, já que esse comportamento não apareceria de repente (?).

Existem dois desses processadores no sistema

https://ark.intel.com/products/120485/Intel-Xeon-Gold-6140-Processor-24_75M-Cache-2_30-GHz

Há cerca de 8000GB de RAM também.

Eu gostaria de algumas explicações sobre por que isso pode estar acontecendo.

Fico feliz em fornecer mais informações. Eu sei que esta é uma questão complexa e não tenho certeza de quais informações você precisa no total.


0


origem


Como você escreveu seu programa? As instâncias de processo separadas precisam sincronizar umas com as outras ou enviar dados entre elas? Além disso, eles usam qualquer outra coisa além da CPU? Eles consomem (mais do que o normal) RAM, eles gravam em disco (tem E / S) ou similar? - Fanatique
Sim, há várias instâncias em que elas são sincronizadas e um nó (nó mestre) envia dados para todos os outros nós. No entanto, para a maioria dos meus outros experimentos (sub 1 mil de tamanho), o tempo de comunicação à medida que aumentamos a contagem do processador parece quase constante. Talvez aumente um pouco. Mas nada como saltar de 10 a 30 segundos, como neste caso. - HMPARTICLE
Quais são as quantidades reais de dados sendo empurradas? Você diz que seu "sistema" é "1 milhão por 1 milhão", mas na verdade isso é um pouco sem sentido, quanto dados está tendo que ser sincronizado entre todos esses processos como cada tamanho que você está testando? Qual linguagem de programação você está usando? Até mesmo o Python tem MPI, mas o Python pode lutar com conjuntos de dados dinâmicos massivos ... embora o mesmo possa ser dito para qualquer idioma. - Mokubai♦
Eu estou usando o C ++. Eu dou a dimensão como um produto de dois inteiros pares, então n = 256 e m = 512 por exemplo. Suponha que eu tenha 4 processos. Em seguida, o nó 0 distribui (512/4) * 256 ^ 2 "duplica" para cada um dos processos. O quadrado é porque as matrizes estão sendo passadas. Faz algum cálculo e, em seguida, no final do cálculo MPI_allgather é chamado. - HMPARTICLE
Se você tem dois processadores e está usando MPI, você está levando em conta o fato de que cada processador pode ter seu próprio banco de RAM e os dados precisam estar presentes em ambos os bancos ou os processos na segunda CPU podem ter que ler isto através o primeiro CPU. Seu sistema está usando NUMA ou de outra forma, atingindo tais limitações? - Mokubai♦


Respostas:


Difícil de diagnosticar dessa maneira, mas aqui estão alguns pontos:

  • Cada processo usa RAM, então dobrando o número de processos significa duplicando a RAM necessária. Se a RAM física disponível estiver esgotada, a troca para o disco diminuirá em processamento.

  • Mesmo em um computador com vários núcleos, alguns recursos são comuns a todos os processos. Estes incluem principalmente RAM e disco, portanto, uso intensivo significa que processos irão disputar o acesso a recursos e haverá esperas.

  • Se os processos usarem métodos de sincronização, como semáforos, Espera-se algum tempo perdido em esperas, o que aumentará em proporção direta ao número de processos.

Muitos desses gargalos podem ser vistos simplesmente observando o comportamento de seus processos através do Gerenciador de Tarefas ou do Gerenciador de Recursos, para que você possa identificar o gargalo e aperfeiçoá-lo.


0