2011-12-07 38 views
7

Giả sử rằng tôi muốn làm một cái gì đó trong R mà bình thường (trong một quá trình/thread) trông như thế này:Tôi có thể lồng song song ::: parLapply() không?

for(i in 1:2) { 
    for(j in 1:2) { 
     #Do some stuff here 
    } 
} 

Sử dụng song song gói mới R, trên một máy lõi tứ, tôi có thể làm như sau?

cluster<-makeCluster(4) 

innerLoop<-function() { 
    #Do some stuff here 
} 

outerLoop<-function() { 
    result<-do.call(, parLapply(cluster, c(1:2), innerLoop)) 
} 

final.result<-do.call(, parLapply(cluster, c(1:2), outerLoop)) 

Điều này có thể thực hiện với gói song song đi kèm với R-2.14.0 không?

+4

Điều gì sẽ xảy ra nếu bạn thử? – Andrie

Trả lời

9

Có, bạn có thể làm điều đó. Đối với mức độ song song đầu tiên, bạn phải sử dụng công nghệ bộ nhớ phân tán (như makeCluster() từ gói tuyết) và ở mức thứ hai của sự song song bạn phải sử dụng công nghệ bộ nhớ chia sẻ (gói đa lõi, mclapply()).

Dưới đây là một ví dụ mã đơn giản:

library(parallel) 

cl <- makeCluster(2) 

inner <- function(x){ 
    pid <- Sys.getpid() 
    name <- Sys.info()["nodename"] 
    str <- paste("This is R running on", name, "with PID", pid, "!") 
    return(str) 
} 

outer <- function(x, cores, funceval){ 
    require(parallel) 
    mclapply(1:cores, funceval) 
} 

parLapply(cl, 1:length(cl), outer, 2, inner) 

Trong đầu ra bạn sẽ thấy tên máy khác nhau và PID khác nhau!

+0

Cảm ơn Markus. Tôi có thể tránh sử dụng mutlicore/mclapply() để làm cho mã của tôi di động với Windows không? – power

+0

Tôi nghĩ là không. Có lẽ bạn có thể sử dụng SOCK và MPI kết hợp! –

+0

Một số mã kiểm tra nhanh cho thấy câu trả lời của bạn là chính xác cho các cụm SOCK, nhưng tôi không rõ lý do tại sao có thể (đặc biệt nếu bên ngoài tạo đối tượng cluster riêng của nó để làm việc). Bạn có biết? Có phải 'họ' chỉ bảo vệ chúng ta khỏi chính mình? – russellpierce

Các vấn đề liên quan