Eu consertei meu problema. Acabou sendo bastante sutil, mas graças a Ozair - ele acertou na cabeça. Minha simulação específica não lê muitos dados (apenas os parâmetros de inicialização), mas gasta muito tempo cuspindo dados calculados. O caminho bruto que eu implementei originalmente, envolvendo o padrão c ++ file.open("tobewritten.dat")
é muito lento, até mesmo por conta própria, mas quando várias instâncias são executadas, as instâncias individuais gastam idades esperando por 'write time' no disco rígido.
Há algumas lições específicas que aprendi:
-
cout << std::endl
libera o buffer em uso; se o buffer não estiver cheio, então há menos que o uso ideal da operação mais rápida de gravação na RAM. Use"\n"
e feche o arquivo no final. O c ++ manipula a liberação do buffer para o disco quando ele está cheio. -
Ao escrever vários arquivos de dados massivos (eu estou falando GBs) ao mesmo tempo, é melhor especificar manualmente o buffer. No momento, eu configurei o buffer para 50MB. Usar grandes buffers significa que seu sistema gasta mais tempo entre a RAM e a CPU e apenas despeja no disco (o bit lento) em intervalos de 50MB
-
Nem use
cout
para gravar no arquivo. É mais lento quesprintf
e suas variantes.
Usando os métodos que descrevi acima, passei de 28% de uso da CPU para cada processo para 100% de uso da CPU. O STADO 'preso' não aparece mais.