Foro de debate

Tiempos de ejecucion en algoritmo paralello en R

Tiempos de ejecucion en algoritmo paralello en R

de Denis Espinosa -
Número de respuestas: 3

Estoy usando las bibliotecas doParallel y foreach para llevar a cabo un algoritmo para hacer un test a un conjunto de numeros aleatorios. El problema esta en que el tiempo de ejecucion del algoritmo secuencial es mucho menor que el de el mismo algoritmo escrito en paralelo. Alguna sugerencia de lo que puede estar pasando. aqui va mi codigo del algoritmo secuencial:

 

carreras_seq<-function(){  
  numerosa<-runif(10e6)
  writeLines("Test Carreras por encima y por debajo de la media para la validacion de independencia en un conjunto de numeros aleatorios")
  media<-0.99/2
  b<-0  
  n<-length(numerosa)
  n1<-0
  n2<-0
  for(i in 1:(n-1))
{    
  #actualizando actual
  if (numerosa[i]>=media){
    n1<-n1+1
    actual<-TRUE
  }
  else
  {
    n2<-n2+1
    actual<-FALSE
  }
  #actualizando siguiente
  if (numerosa[i+1]>=media){
    siguiente<-TRUE
  }
  else
  {     
    siguiente<-FALSE
  }
  if (actual!=siguiente) {b<-b+1 }
   
}
#validandola ultima
if ((numerosa[n]>=media && numerosa[n-1]<media) || (numerosa[n]<media && numerosa[n-1]>=media))
  b<-b+1
if (numerosa[n]>=media){n1<-n1+1}else{n2<-n2+1}
writeLines(paste("n1 = ",toString(n1),"n2 = ",toString(n2),"b = ",toString(b),sep=" "))  
m<-(2*n1*n2)/n +0.5
o<-2*n1*n2*(2*n1*n2 - n)/(n^2*(n-1))
writeLines(paste("Mb = ",toString(m),"O^2b = ",toString(o),sep=" "))
z<-(b-m)/o^(.5)
writeLines(paste("Valor del estadigrafo de prueba Z = ",toString(z),sep=" "))  
z

}

y por aca el mismo en paralelo

carreras<-function(numerosa){  
  c<-iniciaCluster()
  writeLines("Test Carreras por encima y por debajo de la media para la validacion de independencia en un conjunto de numeros aleatorios")
  numerosa<-runif(10e6)
  media<-0.99/2
  b1<-0  
  n<-length(numerosa)
  n1<-0
  n2<-0
  b<-foreach(i = 1:(n-1), .combine = "+") %dopar%
  {    
    #actualizando actual
    if (numerosa[i]>=media){
      n1<-n1+1
      actual<-TRUE
    }
    else
    {
      n2<-n2+1
      actual<-FALSE
    }
    #actualizando siguiente
    if (numerosa[i+1]>=media){
      siguiente<-TRUE
    }
    else
    {     
      siguiente<-FALSE
    }
    if (actual!=siguiente) {b1 <- 1} else b1<- 0
    b1     
  }
  #validandola ultima
  if ((numerosa[n]>=media && numerosa[n-1]<media) || (numerosa[n]<media && numerosa[n-1]>=media))
   b<-b1+1
  if (numerosa[n]>=media){n1<-n1+1}else{n2<-n2+1}
  writeLines(paste("n1 = ",toString(n1),"n2 = ",toString(n2),"b = ",toString(b),sep=" "))  
  m<-(2*n1*n2)/n +0.5
  o<-2*n1*n2*(2*n1*n2 - n)/(n^2*(n-1))
  writeLines(paste("Mb = ",toString(m),"O^2b = ",toString(o),sep=" "))
  z<-(b-m)/o^(.5)
  writeLines(paste("Valor del estadigrafo de prueba Z = ",toString(z),sep=" "))  
  z
  stopCluster(c)
}

 

En respuesta a Denis Espinosa

Re: Tiempos de ejecucion en algoritmo paralello en R

de Manuel Muñoz Márquez -

Buenas Denis:

La ejecución en paralelo de código significa que además de los cálculos debe haber comunicación entre los diferentes nodos donde se ejecuta el código. Si el tiempo necesario para ejecutar cada porción de código es pequeño el tiempo que ganas repartiendo la ejecución lo pierdes con creces en la comunicación.

Te sugiero que dividas tu código en porciones que requieran un tiempo significativo y que repartas el trabajo usando estas porciones "gruesas".

Saludos.

En respuesta a Manuel Muñoz Márquez

Re: Tiempos de ejecucion en algoritmo paralello en R

de Denis Espinosa -

he probado eso, no crees que sera problema con el SO o el Harware que uso. Uso una laptop con microprocesador AMD A8 con cuatro nucleos a 1.9GHZ y arquitectura de 64bit, SO: windows 10 de 64 bit tambien. Incluyo las librerias doParallel y foreach al inicio. Alguna idea.