Como computo a sobrecarga paralela de um código paralelo executado em um único processador quando nenhum código seqüencial está disponível?

8

Estou analisando o desempenho dos solucionadores lineares do PETSc. Como eu entendo,

acelerar=Tempo SeqüencialTempo Paralelo.

Eu sei que a execução do código paralelo em um processador pode ser usada como proxy para o desempenho seqüencial. No entanto, não acho que seja uma boa medida de um código seqüencial equivalente devido à sobrecarga paralela incorrida. Freqüentemente, o desempenho de um código seqüencial é mais rápido que o desempenho paralelo em um único processador. Suponho que eu poderia procurar bibliotecas numéricas que implementam o mesmo solucionador, mas não há garantia de que o algoritmo seja realmente equivalente.

Como eu entendo,

Desempenho paralelo em um processador=Tempo Seqüencial+Sobrecarga paralela

Assim, se houver uma maneira de quantificar a sobrecarga paralela, poderíamos subtraí-la do tempo paralelo em um processador para obter uma melhor medida do tempo seqüencial.

Então, minhas perguntas seriam:

  1. Existe uma maneira de calcular a sobrecarga paralela de um código paralelo executado em um único processador quando nenhum código seqüencial está disponível?
  2. Isso é realmente necessário? O desempenho paralelo em um processador é bom o suficiente para aproximar o desempenho seqüencial, em geral?
Paulo
fonte
A aceleração é uma medida relativa e não diz muito sobre desempenho absoluto. A aceleração pode ser medida em uma implementação sequencial pura, fazendo o mesmo trabalho útil ou em uma implementação paralela (com sobrecarga conforme indicado). Em cada caso, a aceleração pode ser bem diferente devido à sobrecarga paralela e / ou possíveis caminhos de execução diferentes no conjunto de instruções do aplicativo. Por que você deseja estimar a sobrecarga paralela?
Allan P. Engsig-Karup
@ AllanP.Engsig-Karup: Eu acho que minha principal motivação é saber como obter uma estimativa razoável do código seqüencial quando tudo o que tenho é código paralelo.
Paul
1
@ Paul: Vou tentar dar uma resposta real mais tarde, mas muitas vezes existem compensações feitas para obter um algoritmo escalável. A aceleração deve realmente ser medida em relação à melhor implementação serial que, dada a mesma entrada, produz a mesma saída (módulo pequenas perturbações).
Jack Poulson
@ Jack: Concordo. Além disso, na minha opinião, as acelerações relativas não são muito úteis, a menos que sejam dados tempos absolutos.
Allan P. Engsig-Karup
1
@ Jack: eu discordo. A melhor implementação serial pode não ser sua. A aceleração de um código provavelmente deve ser medida em relação ao seu próprio desempenho serial. Em seguida, sua implementação deve ser medida em relação a outras implementações em termos relativos e absolutos. O uso de uma implementação serial não relacionada no numerador provavelmente é enganoso.
Bill Barth

Respostas:

5

Acho que, desde que você diga com o que mede a aceleração, ninguém o culpará por usar o tempo que a versão paralela do código leva para ser executada em um processador. Se você também der o tempo total de um dos seus casos (digamos o tempo do processador único), as pessoas poderão comparar sua implementação com outras da literatura ou com as próprias.

Para alguns problemas, nenhum resultado de uni-processador será possível computar, considerando as restrições de memória ou tempo. Dado que, a maioria das pessoas entende ao olhar para os resultados de aceleração, que as coisas são calculadas em relação ao menor número de processadores disponíveis e que o dado de um único processador é o código paralelo executado em um processador.

Não existem regras rígidas, mas você deve ser explícito sobre o que está fazendo e fornecer ao leitor informações suficientes para calcular outras quantidades que possam interessá-los.

Bill Barth
fonte
0

Eu não estou familiarizado com os internos do PETSc (ao contrário de outros especialistas do PETSc aqui), mas acho que não deve haver sobrecarga paralela com o PETSc desde que você execute seu trabalho como um único processo (ou seja, sem particionamento, etc.).

Lembre-se de que o PETSc também pode ser instalado sem MPI, o que significa que qualquer pequena sobrecarga de MPI que possa estar lá (supondo que todas as chamadas MPI reais sejam feitas durante a execução em um núcleo que duvido muito) também pode ser descontado.

Obviamente, isso é verdade quando a sobrecarga paralela é principalmente de comunicação e não algorítmica.

stali
fonte
Isso pode ser verdade para petsc, mas provavelmente não é verdade para código paralelo em geral.
Paul