2012-12-07 10 views
6

मुझे यकीन नहीं है कि लूप को स्वतंत्र होने के समानांतर के पुनरावृत्तियों के लिए इसका क्या अर्थ है। क्या लूप्स के लिए दो मान्य समांतर का उदाहरण निम्नलिखित है? वे एक ही मैट्रिक्स को लिखते और पढ़ते हैं, लेकिन मैट्रिक्स इंडेक्स प्रत्येक पुनरावृत्ति के लिए अद्वितीय होते हैं।लूप के लिए समानांतर एक सामान्य मैट्रिक्स को लिख सकते हैं?

X = zeros(64); 
parfor i = 1:64^2 
    X(i) = i; 
end 
parfor i = 1:64 
    X(i,:) = X(i,:) .* randn(1,64); 
end 
+0

Matlab एक त्रुटि समानांतर लूप नहीं होने पर त्रुटि को आउटपुट करता है। तो, आपको बस इसे मैटलैब में चलाने की ज़रूरत है, और आपके पास तुरंत जवाब होगा। – Oli

+2

दस्तावेज़ों से यह उद्धरण यह इंगित करता है कि मैटलैब हमेशा चेतावनी नहीं देता है: "नोट पुनरावृत्ति आदेश की आजादी के कारण, पारदर्शी निष्पादन निर्धारिती परिणामों की गारंटी नहीं देता है।" – Andreas

+1

इसका मतलब यह है कि पुनरावृत्ति किसी भी क्रम में किया जा सकता है। इसका आपके मामले पर कोई प्रभाव नहीं पड़ता है। – Oli

उत्तर

4

जहां तक ​​parfor का संबंध है, निम्नलिखित तीन बयानों समकक्ष के रूप में माना जा सकता है:

1) एक parfor पाश की पुनरावृत्तियों स्वतंत्र होना चाहिए।

2) parfor लूप का कोई पुनरावृत्ति किसी भी अन्य पुनरावृत्ति के परिणाम पर निर्भर नहीं हो सकता है।

3) एक parfor पाश की पुनरावृत्तियों में सक्षम होना चाहिए (@Oli से)

किसी भी क्रम कैसे इन बयानों एक नियमित रूप से पाश की तुलना में कैसे में किया जा करने के लिए? 1 से 8 तक एक विशिष्ट पाश में, उदाहरण के लिए, चौथा पुनरावृत्ति पुनरावृत्तियों 1, 2, और 3 पर निर्भर हो सकता है, क्योंकि सॉफ़्टवेयर निश्चित हो सकता है कि जब तक हम पुनरावृत्ति संख्या 4 तक पहुंचते हैं, तब तक ये पुनरावृत्तियों पहले से ही घटित हो चुके हैं। पुनरावृत्तियों 5, 6, 7, और 8 पर निर्भर करता है, क्योंकि सॉफ़्टवेयर निश्चित हो सकता है कि ये पुनरावृत्ति नहीं हुई होगी।

parfor लूप में, @ ओली राज्यों के रूप में, लूप किसी भी क्रम में हो सकते हैं। वे निम्नलिखित क्रम में हो सकते हैं, उदाहरण के लिए, 7 3 4 1 2 5 8 6. या इन 8 संख्याओं का कोई क्रमपरिवर्तन। इसका अर्थ कुछ महत्वपूर्ण है: इस तथ्य से पहले जानने का कोई तरीका नहीं है कि पुनरावृत्ति पहले कब होगी। इसे देखने के लिए, बस अपने parfor लूप के अंदर fprintf('Up to iteration %d of %d\n', t, T) चक करें, जहां t लूप सबस्क्रिप्ट है और T लूप ऊपरी बाउंड है।

उपर्युक्त विवरण तुरंत निम्नलिखित निष्कर्ष का तात्पर्य है: चूंकि कोई पुनरावृत्ति पहले हो सकता है, इसलिए यह महत्वपूर्ण है कि कोई पुनरावृत्ति किसी अन्य पुनरावृत्ति के नतीजे पर निर्भर न हो। मैं कुछ उदाहरण के साथ जवाब निष्कर्ष निकाल लेंगे:

X = ones(8, 8) 
parfor n = 1:8 
    X(:,n) = X(:,n) .* (3 * ones(8,1)); 
end 

इस उदाहरण में, (3 * ones(8,1)) स्पष्ट रूप से किसी अन्य यात्रा पर निर्भर नहीं करता - पाश काउंटर के संबंध में निरंतर किया जा रहा है। इसी प्रकारएनएच के अलावा किसी भी पुनरावृत्ति पर निर्भर नहीं है। संपादित करें: मैं पहले उपरोक्त उदाहरण में randn का उपयोग कर रहा था - @AndrewJanke द्वारा प्रदान की गई टिप्पणियों में चर्चा देखें कि यह एक बुरा विचार क्यों था। इस स्थिति के बारे में क्या:

X = ones(8, 8); 
parfor n = 1:8 
    X(:,n) = X(:,n) + (n + 1); 
end 

यह भी पूरी तरह से मान्य है। यद्यपि अभिव्यक्ति में n + 1 है, यह पुनरावृत्ति संख्या n + 1 पर निर्भर करता है। इसके बजाय यह वर्तमान पुनरावृत्ति संख्या, प्लस 1, से X का पूर्णांक मान असाइन कर रहा है।

अंत में, पर विचार करें:

X = ones(8, 1); 
parfor n = 2:8 
    X(n, 1) = X(n-1, 1) + 1; 
end 

यह एक नियमित रूप से पाश में पूरी तरह से वैध होगा के बाद से यात्रा संख्या n-1 हमेशा से पहले यात्रा n (हम आगे पाशन कर रहे हैं यह सोचते हैं) हो जाएगा। लेकिन parfor लूप में, यह एक त्रुटि उत्पन्न करेगा, क्योंकि पुनरावृत्ति संख्या n पुनरावृत्ति संख्या n-1 से पहले हो सकती है।लिंगो मैटलैब का उपयोग यहां समस्या का वर्णन करने के लिए किया जाता है जिसे "स्लाइसिंग" कहा जाता है। लूप पुनरावृत्तियों द्वारा कटा हुआ X कल्पना कीजिए। फिर nth पुनरावृत्ति में, आप कभी भी X के nth टुकड़ा का उल्लेख कर सकते हैं।

एक अंतिम बिंदु, अगर मुझे कभी भी parfor लूप के बारे में संदेह है, तो मैंने दस्तावेज में खंड को पढ़ा है: "मैटलैब में लूप के समानांतर - अवलोकन" (क्षमा करें, संबंधित वेबपृष्ठ नहीं मिल सकता - Matlab के लिए असामान्य प्रलेखन) यह लूप के अंदर सभी संभावित परिवर्तनीय वर्गीकरणों का वर्णन करता है, और प्रत्येक वर्गीकरण पर प्रतिबंध parfor लूप स्थानों का वर्णन करता है। इस जवाब में मैंने जो चर्चा की है वह वास्तव में केवल हिमशैल की नोक है। उदाहरण के लिए, n = n + 1 जैसे विवरण parfor लूप में भी अमान्य हैं, क्योंकि n लूप चर है, और लूप चर के लिए असाइनमेंट की अनुमति नहीं है।

+1

हम्म। आप जानते हैं, 'रैंडन' इसके लिए एक बुरा उदाहरण हो सकता है, क्योंकि इसका मैटलैब के वैश्विक राज्य पर दुष्प्रभाव है। यह एक पीआरएनजी है, और प्रत्येक Matlab सत्र एक ही यादृच्छिक बीज के साथ शुरू होता है; प्रत्येक 'रैंडन' कॉल इसे आगे बढ़ाता है। तो इसका आउटपुट पिछले लूप पुनरावृत्तियों पर निर्भर करता है; 'रैंडन' का उत्पादन एक समारोह है कि उस सत्र में इसे कितनी बार बुलाया गया है। प्रत्येक कार्यकर्ता एक सत्र होता है, इसलिए इस कोड के परिणाम इस बात पर निर्भर होंगे कि कितने श्रमिक हैं, लूप किस क्रम में चलते हैं, और उन सत्रों की 'आरएनजी' स्थिति को और किसने प्रभावित किया है। –

+1

यही है, मुझे लगता है कि 'रैंडन' का उपयोग करके "यह महत्वपूर्ण है कि कोई पुनरावृत्ति किसी अन्य पुनरावृत्ति के नतीजे पर निर्भर न हो" नियम का उल्लंघन करता है, क्योंकि 'रैंडन' नामक पुनरावृत्ति के नतीजे का हिस्सा यह है कि 'आरएनजी' उन्नत है , और यह 'रैंडन' के लिए एक छिपी हुई इनपुट है। यह nondeterminism है कि 'parfor' चेक पकड़ नहीं सकता है, तो एक मानव प्रोग्रामर या तो इससे बचने की जरूरत है, या सुनिश्चित करें कि nondeterminism "कोई फर्क नहीं पड़ता"। यहां करने के लिए "दाएं" चीज शायद 'parfor' से पहले रैंड्स के पूरे ब्लॉक को उत्पन्न करने के लिए है, और उसके बाद लूप पुनरावृत्तियों में इसे स्लाइस करें; तो आपके पास पुनरुत्पादन होगा। –

+0

@AndrewJanke मैंने इसके बारे में सोचा नहीं था! बहुत चालाक! मैंने 'रैंडन 'को हटाने के लिए जवाब समायोजित कर दिया है। मुझे लगता है कि यह केवल उपरोक्त उत्तर में सबसे यादृच्छिक संख्या जनरेटर के निहित निर्धारणवाद की चर्चा को शामिल करने के लिए पाठक को भ्रमित साबित करेगा। –