A dica ainda continua: user mc.core=<numero de nucleos><div><br></div><div class="gmail_extra"><br><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">Benilton:<br>
Repeti o código numa maquina diferente (um desktop, Ubuntu antigo,<br>
10.04). Nem cheguei a usar o mc.core. O resultado no caso anomalo<br>
agora voltou ao normal: o mclapply reduziu o tempo pela metade (tenho<br>
2 CPUs).<br>
Não sei o que aconteceu com o meu notebook que usei para rodar o<br>
código no fim de semana (lembro de ter repetido mais de uma vez)...<br>
<br>
Fernando:<br>
Muito obrigado pela dica. Vou levar isto em consideração nas minhas<br>
programações.<br>
<br>
abraços,<br>
Adriano<br>
Ecologia - UFG<br>
<br>
<br>
<br>
<br>
Em 27 de novembro de 2012 11:10, FHRB Toledo<br>
<<a href="mailto:fernandohtoledo@gmail.com">fernandohtoledo@gmail.com</a>> escreveu:<br>
<div class="HOEnZb"><div class="h5">> Adriano,<br>
><br>
> Veja que com certeza a vantagem do mclapply vai depender de como você<br>
> engendrou sua paralelização, explico: a vantagem não é efetiva pois existe<br>
> um tempo que o processador vai demorar " distribuindo" as tarefas entre<br>
> processadores! Você deve observar isso!<br>
><br>
> Vou citar um caso.<br>
><br>
> Imagine ter que realizar 1000 simulações em 10 cenários (entenda cenários<br>
> como uma alteração dos parâmetros da simulação) e seja uma máquina com 5<br>
> processadores. Nesse caso, posso pensar em realizar uma paralelização de<br>
> duas formas (deve haver mais, mas isso não evm ao caso). Uma delas seria,<br>
> colocar um laço (for, por exemplo), entre os cenários e distribuir as 1000<br>
> simulações entre os 4 processadores e cada um faria 200 destas. Ou então,<br>
> distribuir os cenários entre os 5 processadores, o que ele faria em duas<br>
> vezes e então usar um laço para cada uma das 1000 simulações.<br>
><br>
> Como você pode observar no primeiro caso estão envolvidos MUITO mais<br>
> distribuições de códigos entre processadores que no primeiro, portanto, para<br>
> a mesma tarefa, com os mesmos recursos computacionais teremos tempos<br>
> bastante distintos. Essa distinção de tempo também leva em conta o próprio<br>
> tempo da tarefa, se por acaso cada simulação leva um tempo "pequeno" acho (O<br>
> Benilton pode confirmar ou descordar :) ), a segunda opção seria bem mais<br>
> vantajosa, mas se cada simulação demorar "bastante" os tempos tendem a<br>
> acabar se compensando!<br>
><br>
> Espero ter sido claro! Fico à disposição (parafraseando o Walmes).<br>
><br>
> att,<br>
> FH<br>
><br>
> 2012/11/27 Adriano S. Melo <<a href="mailto:asm.adrimelo@gmail.com">asm.adrimelo@gmail.com</a>><br>
>><br>
>> Colegas,<br>
>><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>
>>  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>
>> ### 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>
>> Sugestões do que pode estar acontecendo?<br>
>> Em que situação vale a pena usar o mclapply?<br>
>><br>
>> 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>
>> > 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<br>
>> código mínimo reproduzível.<br>
><br>
><br>
><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<br>
> mínimo reproduzível.<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>