2016-05-25 6 views
-1
library(parallel) 
# Calculate the number of cores 
no_cores <- detectCores() - 1 
# Initiate cluster 
cl <- makeCluster(no_cores) 

statesNames=c("a","b","c") 
mcA<-new("markovchain", states=statesNames, transitionMatrix=matrix(c(0.2,0.5,0.3,0,0.2,0.8,0.1,0.8,0.1),nrow=3, byrow=TRUE, dimnames=list(statesNames,statesNames))) 
mcB<-new("markovchain", states=statesNames, transitionMatrix=matrix(c(0.2,0.5,0.3,0,0.2,0.8,0.1,0.8,0.1),nrow=3, byrow=TRUE, dimnames=list(statesNames,statesNames))) 
mcC<-new("markovchain", states=statesNames, transitionMatrix=matrix(c(0.2,0.5,0.3,0,0.2,0.8,0.1,0.8,0.1),nrow=3, byrow=TRUE, dimnames=list(statesNames,statesNames))) 
mclist <- new("markovchainList", markovchains = list(mcA, mcB, mcC)) 
mc <- mclist 

clusterExport(cl, "mclist") 

f <- function(x) { 
    n <- length([email protected]) 
    seq <- character(length = n) 

    t0 <- ([email protected][[1]]@states)[1] 


    for(i in 1:n) { 
    stateName <- [email protected][[i]]@states 
    t0 <- sample(x = stateName, size = 1, 
      prob = [email protected][[i]]@transitionMatrix[which(stateName == t0), ]) 

    seq[i] <- t0 
    } 
    return(seq) 
} 

Ich habe zwei Funktionen, die die gleiche Aufgabe ausführt. Einer verwendet ein paralleles Paket und ein anderer nicht. Ich dachte, nach der Verwendung des Parallelpakets wird die Ausführung schnell sein. Aber es scheint eher langsam zu sein.Die Ausführungszeit wird nicht verringert, auch wenn das parallele Paket in R verwendet wird?

> microbenchmark(rmarkovchain(100, mc, "matrix",useRCpp = F), parSapply(cl, 1:100,f)) 
Unit: milliseconds 
             expr  min  lq  mean median  uq  max neval 
rmarkovchain(100, mc, "matrix", useRCpp = F) 3.632955 4.251373 5.611569 5.507326 6.681284 11.92689 100 
         parSapply(cl, 1:100, f) 40.929350 43.893277 45.516566 45.373365 47.366842 52.80290 100 

Da ich Linux benutze ich habe mclapply statt parSapply und jetzt ist es besser als parSapply aber immer noch langsamer verwendet.

> microbenchmark(rmarkovchain(100, mc, "matrix",useRCpp = F), mclapply(cl, 1:100,f)) 
Unit: milliseconds 
             expr  min  lq  mean median  uq  max neval 
rmarkovchain(100, mc, "matrix", useRCpp = F) 3.798599 3.97889 6.636692 6.053313 8.935721 18.08281 100 
         mclapply(cl, 1:100, f) 14.862175 20.81366 26.211019 25.636895 31.893560 34.42886 100 

Warum kann ich nicht die Arbeit mit parallelen Paket in R beschleunigen?

+1

wahrscheinlich weil 'f' ist eine viel langsamere Funktion als' rmarkovchain' – Chris

+1

Wie viele Kerne haben Sie? Oft kann der Aufwand für die Parallelverarbeitung "teurer" sein als die Geschwindigkeit der Verteilung. Dies ist insbesondere dann der Fall, wenn die Anzahl der Kerne gering ist. –

+0

4 Kerne sind verfügbar – cryptomanic

Antwort

0

Ich war völlig einverstanden mit Andrew Taylor.

Ich habe gelesen this Post und dort lese ich es wird nützlich sein, parallel Paket zu verwenden, wenn eine bestimmte Aufgabe lange Zeit (ein paar Sekunden) dauert.

diesen I Um zu testen, erhöht die Anzahl des Ausgangs d.h. von 100 zu 10000

> microbenchmark(rmarkovchain(10000, mc, "matrix",useRCpp = F), mclapply(cl, 1:10000,f)) 
Unit: milliseconds 
              expr  min   lq  mean  median   uq  max neval 
rmarkovchain(10000, mc, "matrix", useRCpp = F) 1140.07516 1186.11030 1294.44378 1224.73236 1401.15991 1824.34178 100 
         mclapply(cl, 1:10000, f) 18.27705 22.48832 28.23278 30.33396 33.06192 42.69159 100 

Nun Parallelverarbeitung schneller ist als sequentielle Ausführung.

+0

immer noch wahrscheinlich viel Platz für die Optimierung innerhalb Ihrer 'f' -Funktion ... Unterprogramm innerhalb einer Schleife ist oft ein großer Aufhängungsfaktor, und kann vektorisiert werden – Chris

Verwandte Themen