Ao executar benchmarks Gromacs em diferentes configurações (nós intra-node vs 2, 3 e 4 conectados ao Infiniband), notamos degradação severa do desempenho.
Para investigar, criamos um programa de teste que usa MPI_Alltoall()
para transferir pacotes de dados de vários tamanhos (4 bytes a 2 MB) entre todos os nós.
Os tempos internos do programa de teste e as estatísticas reunidas do I_MPI_STATS
do IntelMPI mostram o mesmo padrão: para pequenas quantidades de dados, a largura de banda resultante é aceitável, enquanto que para cargas maiores o comportamento se torna errático: algumas das transferências demoram muito (cerca de 2,15 segundos), então o desempenho médio entra em colapso. Estes atrasos muito longos parecem estar ocorrendo de forma estocástica, de modo que podem estar ausentes ou pequenos tamanhos de amostra (por exemplo, 100 transferências por tamanho de carga útil). Aqui estão alguns dados de amostra obtidos com 4 nós em 1000 transferências por tamanho:
# Message size Call count Min time Avr time Max time Total time
Alltoall
1 2097152 1000 5649.09 13420.98 2152225.97 13420980.69
2 1048576 1000 2874.85 13000.87 2151684.05 13000867.13
3 524288 1000 1404.05 8484.15 2149509.91 8484153.99
4 262144 1000 719.07 5308.87 2148617.98 5308866.74
5 131072 1000 364.78 9223.77 2148303.99 9223767.04
6 65536 1000 206.95 5124.41 2147943.97 5124409.44
7 32768 1000 120.88 12562.09 2147678.85 12562089.68
8 16384 1000 36.00 57.03 93.94 57034.25
9 8192 1000 22.89 34.80 103.00 34803.87
Estamos usando o QDR Infiniband por meio de um switch não gerenciado e o IntelMPI 4.0.3. Eu tentei verificar com MPI fora do caminho, configurando uma transferência semelhante a um anel (node1 - > node2 - > node3 - > node4 - > node1) com ib_send_bw, mas não observou nenhum comportamento problemático:
#bytes #iterations BW peak[MB/sec] BW average[MB/sec]
16384 10000 1202.93 1202.91
32768 10000 1408.94 1367.46
65536 10000 1196.71 1195.85
131072 10000 1195.68 1180.71
262144 10000 1197.27 1167.45
524288 10000 1162.94 1154.15
1048576 10000 1184.48 1151.31
2097152 10000 1163.39 1143.60
4194304 10000 1157.77 1141.84
8388608 10000 1141.23 1138.36
Minha pergunta: existe alguma maneira de analisar mais profundamente isso para descobrir qual é a causa raiz do problema? Eu já examinei o manual de referência do IntelMPI, mas não vi nada de útil, exceto o I_MPI_STATS
.
Tags mpi