Eu tenho um aplicativo que pode ser trivialmente paralelizado, mas seu desempenho é em grande parte limitado a E / S. O aplicativo lê uma única matriz de entrada armazenada em um arquivo com tamanho geralmente de 2 a 5 GB (mas espero que esse número aumente no futuro). Um cálculo típico aplica a mesma operação a cada linha ou coluna dessa matriz. Para operações pesadas na CPU, eu tenho um dimensionamento muito bom de cerca de 100 processadores, mas para operações mais lentas, a E / S e a comunicação relacionada (acesso NFS) dominam e não posso usar mais do que alguns processadores com eficiência.
Quais são as opções eficientes e portáteis (idealmente eficientes em termos portáteis) para essa situação? HDF5 paralelo parece promissor. Alguém tem experiência na vida real com isso?
MPI-I / O seria algo que vale a pena examinar? Ele pode funcionar eficientemente com um determinado layout de arquivo ou eu tenho que adaptar tudo?
fonte
Respostas:
A E / S paralela pode ajudá-lo nesse caso, mas se você estiver usando o NFS (inerentemente bastante serial) para servir seus arquivos, ele não terá o efeito total que você deseja - haverá um gargalo serial no O servidor de arquivos e ter centenas de processos fazendo solicitações ao servidor único não fornecerão fatores de centenas de acelerações ao fazê-lo através de um único processo. Ainda assim, isso pode ajudar até certo ponto, especialmente porque parece que o gargalo está lendo e não escrevendo, e será uma grande melhoria se o sistema for atualizado para um sistema de arquivos totalmente paralelo.
MPI-IO é de nível muito baixo; vale a pena entender algo sobre o assunto para saber o que está acontecendo " oculto " com o HDF5, NetCDF4 ou ADIOS paralelo , mas usá-lo é realmente adequado apenas para dados binários brutos, nos quais a estrutura é bem conhecida em tempo de compilação. HDF5 e NetCDF4 são muito mais flexíveis.
Observe que, se seus dados forem relativamente simples - por exemplo, as estruturas de big data são principalmente matrizes ou vetores n-dimensionais - eu recomendo o NetCDF4 (que também é paralelo e baseado no HDF5) em vez do HDF5; é significativamente mais fácil de usar. O HDF5 é mais complicado e, em troca dessa complexidade, permite modelos de dados muito complicados. Mas se esse é um recurso que você não precisa, é mais rápido começar no NetCDF4.
Em nosso centro, temos uma aula de E / S paralela, de uma tarde e outra, onde falamos sobre os conceitos básicos, MPI-IO, HDF5 e NetCDF4; os slides podem ser encontrados aqui .
fonte
Temos uma boa escala para todo o XT6 no ORNL usando MPI / IO para gerar vetores. Aqui está o código . Os subsistemas de E / S para muitas máquinas não são projetados para um paralelismo massivo; portanto, acho que o @Dan está certo em tentar minimizar a IO escrevendo apenas algumas etapas ou alguma outra estratégia de aglomeração.
No que diz respeito à gravação flexível de saída de forma escalável, tenho experiência com o XDMF , que pode ser efetuado por grandes gravações binárias paralelas usando HDF5 (como o PETSc VecView ) juntamente com uma pequena quantidade de código XML escrito em série para descrever o layout. Isso pode ser lido por pacotes de visualização como Paraview ou MayaVi2 . Outra maneira de fazer isso é usar o formato VTK com dados binários anexados, no entanto, isso exige que você saiba tudo o que deseja escrever com antecedência.
fonte
Presumo que seu problema de escalabilidade esteja relacionado à saída e não à entrada. A entrada paralela é bastante simples - o que eu faço é que cada CPU abre o arquivo NetCDF de entrada e lê a parte da matriz que pertence ao seu bloco (pode haver um limite para quantos leitores podem abrir o mesmo arquivo NetCDF, mas não tenho certeza ) A saída paralela é mais problemática.
O que estou fazendo atualmente não é o ideal, mas funciona por enquanto. Eu recolho tudo em uma CPU e faço a saída serial. Enquanto isso, outros jogadores esperam o escritor terminar. Isso funcionou bem para mim, porque eu consegui manter a taxa de computação sobre a saída bastante alta - então a escalabilidade seria boa para mais de 200 CPUs. Mas essa não é a solução que você está procurando.
Outra solução é o que Yann sugeriu - escreva serialmente em arquivos N e faça com que uma CPU drone monte os blocos em uma única peça - se houver RAM permitindo.
Além das bibliotecas de E / S paralelas sugeridas nas respostas anteriores, você também pode consultar o Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , já que você já está familiarizado com o NetCDF e o MPI. Não o usei na prática, mas pretendo ir nessa direção quando eu atingir a parede com a coleta de E / S serial +.
fonte