Como depurar problemas de temporização de MPI

1

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 .

    
por Ansgar Esztermann 08.04.2014 / 12:05

0 respostas

Tags