2011-12-07 11 views
7

मान लीजिए कि मैं आर में कुछ है कि सामान्य रूप से होता है (एक प्रक्रिया/सूत्र में) इस तरह दिखना क्या करना चाहते हैं:, आर के नए पैकेज समानांतर का उपयोग करते हुए एक क्वाड-कोर मशीन परक्या मैं समानांतर घोंसला कर सकता हूं ::: लंबवत()?

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

, मैं निम्नलिखित कर सकते हैं?

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)) 

क्या यह आर-2.14.0 के साथ समानांतर पैकेज के साथ संभव है?

+4

यदि आप इसे आजमाते हैं तो क्या होता है? – Andrie

उत्तर

9

हाँ, आप यह कर सकते हैं। समांतरता के पहले स्तर के लिए आपको वितरित स्मृति तकनीक (बर्फ पैकेज से मेकक्लस्टर() के रूप में उपयोग करना होगा) और समांतरता के दूसरे स्तर में आपको साझा मेमोरी तकनीक (मल्टीकोर पैकेज, mclapply()) का उपयोग करना होगा।

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) 

उत्पादन में आप अलग अलग मशीन के नाम और विभिन्न PIDs देखना चाहिए:

यहाँ एक सरल कोड उदाहरण है!

+0

धन्यवाद मार्कस। क्या मैं अपने कोड को विंडोज़ को पोर्टेबल बनाने के लिए mutlicore/mclapply() का उपयोग करने से बच सकता हूं? – power

+0

मुझे नहीं लगता। शायद आप संयोजन में सॉक और एमपीआई का उपयोग कर सकते हैं! –

+0

कुछ त्वरित परीक्षण कोड से पता चलता है कि आपका जवाब सॉक क्लस्टर के लिए सही है, लेकिन मुझे यह स्पष्ट नहीं है कि यह क्यों हो सकता है (विशेष रूप से यदि बाहरी काम करने के लिए बाहरी क्लस्टर ऑब्जेक्ट बना रहा हो)। क्या आप जानते है? क्या वे सिर्फ हमें खुद से बचा रहे हैं? – russellpierce

संबंधित मुद्दे