Adriano,<div><br></div><div>Veja que com certeza a vantagem do mclapply vai depender de como você engendrou sua paralelização, explico: a vantagem não é efetiva pois existe um tempo que o processador vai demorar " distribuindo" as tarefas entre processadores! Você deve observar isso!</div>
<div><br></div><div>Vou citar um caso.</div><div><br></div><div>Imagine ter que realizar 1000 simulações em 10 cenários (entenda cenários como uma alteração dos parâmetros da simulação) e seja uma máquina com 5 processadores. Nesse caso, posso pensar em realizar uma paralelização de duas formas (deve haver mais, mas isso não evm ao caso). Uma delas seria, colocar um laço (for, por exemplo), entre os cenários e distribuir as 1000 simulações entre os 4 processadores e cada um faria 200 destas. Ou então, distribuir os cenários entre os 5 processadores, o que ele faria em duas vezes e então usar um laço para cada uma das 1000 simulações.</div>
<div><br></div><div>Como você pode observar no primeiro caso estão envolvidos MUITO mais distribuições de códigos entre processadores que no primeiro, portanto, para a mesma tarefa, com os mesmos recursos computacionais teremos tempos bastante distintos. Essa distinção de tempo também leva em conta o próprio tempo da tarefa, se por acaso cada simulação leva um tempo "pequeno" acho (O Benilton pode confirmar ou descordar :) ), a segunda opção seria bem mais vantajosa, mas se cada simulação demorar "bastante" os tempos tendem a acabar se compensando!</div>
<div><br></div><div>Espero ter sido claro! Fico à disposição (parafraseando o Walmes).</div><div><br></div><div>att,</div><div>FH</div><div><br><div class="gmail_quote">2012/11/27 Adriano S. Melo <span dir="ltr"><<a href="mailto:asm.adrimelo@gmail.com" target="_blank">asm.adrimelo@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Colegas,<br>
Enviei o e-mail abaixo mas não recebi resposta. Desconfio que tenha<br>
sido devido ao tamanho da mensagem. Segue uma versão resumida do<br>
problema. Uso Ubuntu 12.04.<br>
<br>
Aparentemente, o maclapply (pacotes multicore ou parallel) tem<br>
desempenho distinto dependendo do código:<br>
<br>
## Aqui o mclapply foi mais bem mais lento que um for loop:<br>
<div class="im"> system.time({<br>
a<-mclapply(1:1000, function(numero) sd(rnorm(100000)))<br>
})<br>
usuário sistema decorrido<br>
528.277 4.544 92.195<br>
<br>
system.time({<br>
a<-vector('list', 1000)<br>
for (i in 1:1000){a[[i]]<-sd(rnorm(100000))}<br>
})<br>
usuário sistema decorrido<br>
16.301 0.520 16.835<br>
<br>
<br>
</div><div class="im">### Mas neste exemplo abaixo ele reduziu o tempo pela metade (como<br>
esperado, visto que tenho 2 CPUs):<br>
library(vegan)<br>
data(BCI)<br>
system.time({<br>
a<-mclapply(1:100, function(numero) nestednodf(BCI))<br>
})<br>
usuário sistema decorrido<br>
127.996 2.520 47.902<br>
<br>
<br>
system.time({<br>
a<-vector('list', 100)<br>
for (i in 1:100){a[[i]]<-nestednodf(BCI)}<br>
})<br>
usuário sistema decorrido<br>
82.765 0.352 83.204<br>
<br>
</div><div class="im">Sugestões do que pode estar acontecendo?<br>
Em que situação vale a pena usar o mclapply?<br>
<br>
</div>Abraços e grato por qualquer ajuda,<br>
Adriano<br>
Ecologia - UFG<br>
<br>
<br>
Em 25 de novembro de 2012 18:21, Adriano S. Melo<br>
<<a href="mailto:asm.adrimelo@gmail.com">asm.adrimelo@gmail.com</a>> escreveu:<br>
<div class="HOEnZb"><div class="h5">> Colegas,<br>
> Estou com um problema de lentidão no uso do mclapply do pacote<br>
> multicore. Uso Ubuntu 12.04 em Dell Latitude E6500, 4Gb Ram e<br>
> processador Centrino2. Trabalho com R no gedit (repeti algumas coisas<br>
> diretamente no R executado no terminal mas não mudou nada). Já<br>
> brinquei bastante com o comando, mas ainda não consegui entender<br>
> exatamente o que está acontecendo (veja que fiz vários testes abaixo).<br>
><br>
> Seguindo uma mensagem anterior desta lista (18out12), executei o<br>
> codigo do Fernando H. Toledo em:<br>
> <a href="http://ridiculas.wordpress.com/2011/10/23/paralelizacao-de-processos/" target="_blank">http://ridiculas.wordpress.com/2011/10/23/paralelizacao-de-processos/</a><br>
> O tempo de processammento SEM mcapply foi de:<br>
> 1> tempoA[3]<br>
> elapsed<br>
> 2.065<br>
><br>
> Com o mcapply foi de:<br>
> 1> tempoB[3]<br>
> elapsed<br>
> 2.135<br>
><br>
> Visto que o tempo do mclapply foi até maior, tentei descobrir o que<br>
> estava acontecendo.<br>
> Achei isto (<a href="https://github.com/markmfredrickson/RItools/issues/2" target="_blank">https://github.com/markmfredrickson/RItools/issues/2</a>):<br>
> "My understanding is that multicore first checks to see if the<br>
> mc.cores argument is set. If so, it uses that value. Next, it checks<br>
> options("cores"), if this is set, it will use that value. If neither<br>
> condition is true, it runs detectCores() itself. So in general, we do<br>
> not need to manually detect cores. The multicore help page has more<br>
> details on this.<br>
><br>
> If you want to override in RItools, you have two options. 1)<br>
> options("cores" = 2) -- multicore will respect this. 2)<br>
> options("RItools-apply" = function(lst, f) { mclapply(lst, f,<br>
> mc.cores= 2) }). You can also use the second strategy to set other<br>
> mclapply options.<br>
><br>
> No meu computador:<br>
> getOption("cores")<br>
> NULL<br>
><br>
> Usei a sugestão 1) acima:<br>
> options("cores" = 2)<br>
> getOption("cores")<br>
> [1] 2<br>
><br>
> Executei o código novamente, mas não adiantou:<br>
> 1> tempoA[3]<br>
> elapsed<br>
> 2.197<br>
> 1> tempoB[3]<br>
> elapsed<br>
> 2.302<br>
><br>
><br>
> Usei a sugestão 2) acima, mas também não adiantou:<br>
> 1> tempoA[3]<br>
> elapsed<br>
> 2.172<br>
> 1> tempoB[3]<br>
> elapsed<br>
> 2.249<br>
><br>
> Fechei tudo e repeti os comandos usando o mclapply do pacote parallel.<br>
> Ele não reconheceu o número de CPUs e portanto coloquei como<br>
> argumento: mc.cores = 2<br>
> Melhorou apenas um pouquinho:<br>
> 1> tempoA[3]<br>
> elapsed<br>
> 2.22<br>
> 1> tempoB[3]<br>
> elapsed<br>
> 2.205<br>
><br>
> ===>> Continuei brincando com o mclapply e vi que as coisas podem ser<br>
> diferentes:<br>
> system.time({<br>
> a<-mclapply(1:1000, function(numero) sd(rnorm(100000)))<br>
> })<br>
> usuário sistema decorrido<br>
> 528.277 4.544 92.195<br>
><br>
> system.time({<br>
> a<-vector('list', 1000)<br>
> for (i in 1:1000){a[[i]]<-sd(rnorm(100000))}<br>
> })<br>
> usuário sistema decorrido<br>
> 16.301 0.520 16.835<br>
> #### Notem que aqui o mclapply foi BEM lento.<br>
><br>
><br>
> #### Mas neste exemplo abaixo ele reduziu o tempo pela metade (como<br>
> esperado, visto que tenho 2 CPUs):<br>
> library(vegan)<br>
> data(BCI)<br>
> system.time({<br>
> a<-mclapply(1:100, function(numero) nestednodf(BCI))<br>
> })<br>
> usuário sistema decorrido<br>
> 127.996 2.520 47.902<br>
><br>
><br>
> system.time({<br>
> a<-vector('list', 100)<br>
> for (i in 1:100){a[[i]]<-nestednodf(BCI)}<br>
> })<br>
> usuário sistema decorrido<br>
> 82.765 0.352 83.204<br>
> ####<br>
><br>
><br>
> Eu tenho 2 CPUs:<br>
> 1> detectCores() # função do pacote parallel<br>
> [1] 2<br>
> No Monitor do Sistema pude observar que de fato o mclapply está usando<br>
> as duas CPUs para processamento (tanto com multicore quanto com<br>
> parallel).<br>
><br>
> Sugestões do que pode estar acontecendo?<br>
> Em que situação vale a pena usar o mclapply?<br>
><br>
> Abraços,<br>
> Adriano S. Melo<br>
> Ecologia - UFG<br>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br>
</div></div></blockquote></div><br></div>