मैं पहली बार आर में समांतरता के साथ खेल रहा हूं। पहली बार एक खिलौना उदाहरण के रूप में, मैंने कोशिश कीforeach()%% कभी-कभी धीमा क्यों होता है?
library(doMC)
registerDoMC()
B<-10000
myFunc<-function()
{
for(i in 1:B) sqrt(i)
}
myFunc2<-function()
{
foreach(i = 1:B) %do% sqrt(i)
}
myParFunc<-function()
{
foreach(i = 1:B) %dopar% sqrt(i)
}
मुझे पता है कि sqrt()
parallellization बात करने के लिए बहुत तेजी से निष्पादित करता है, लेकिन मैं क्या उम्मीद नहीं थी था कि foreach() %do%
होगा for()
की तुलना में धीमी:
> system.time(myFunc())
user system elapsed
0.004 0.000 0.005
> system.time(myFunc2())
user system elapsed
6.756 0.000 6.759
> system.time(myParFunc())
user system elapsed
6.140 0.524 6.096
मैंने देखा है कि अधिकांश उदाहरणों में, foreach() %dopar%
की तुलना में for()
की तुलना में किया गया है। चूंकि foreach() %do%
मेरे खिलौने उदाहरण में for()
से बहुत धीमी थी, अब मैं थोड़ा उलझन में हूं। किसी भी तरह, मैंने सोचा कि ये फॉर-लूप बनाने के बराबर तरीके थे। अंतर क्या है? क्या वे कभी समकक्ष हैं? foreach() %do%
हमेशा धीमा है?
अद्यतन: निम्नलिखित @Peter जुर्माना का जवाब, मैं अद्यतन myFunc
इस प्रकार है:
a<-rep(NA,B)
myFunc<-function()
{
for(i in 1:B) a[i]<-sqrt(i)
}
यह बनाता है for()
थोड़ा धीमा है, लेकिन बहुत ज्यादा नहीं:
> system.time(myFunc())
user system elapsed
0.036 0.000 0.035
> system.time(myFunc2())
user system elapsed
6.380 0.000 6.385
यह प्रश्न भी देखें: http://stackoverflow.com/questions/5007458/problems-using-foreach-parallelization और यह एक: http: // stackoverflow।कॉम/प्रश्न/5012804/एमपीआई-समानांतर-उपयोग-बर्फ-धीमी गति से – Charlie
धन्यवाद @ चार्ली, उन प्रश्नों के उत्तर मेरे खिलौने उदाहरण के साथ किए जाने के बाद मैं जो करने की कोशिश कर रहा हूं, उसके लिए बहुत उपयोगी था! :) मुझे अभी भी यकीन नहीं है कि मैं समझता हूं कि 'foreach' को '% do%' विकल्प का उपयोग करते समय इतना अधिक समय क्यों चाहिए। –
इसका एक बड़ा हिस्सा यह है कि%%% को टुकड़े/असाइनमेंट को पार्सल करना पड़ता है, उन्हें प्रोसेसर को भेजना पड़ता है, फिर अंत में सब कुछ ठीक से पुनः जुड़ें। इन चरणों के लिए संगठनात्मक समय की आवश्यकता है कि असाधारण संस्करण नहीं है। – Charlie