जहां तक 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
लूप चर है, और लूप चर के लिए असाइनमेंट की अनुमति नहीं है।
Matlab एक त्रुटि समानांतर लूप नहीं होने पर त्रुटि को आउटपुट करता है। तो, आपको बस इसे मैटलैब में चलाने की ज़रूरत है, और आपके पास तुरंत जवाब होगा। – Oli
दस्तावेज़ों से यह उद्धरण यह इंगित करता है कि मैटलैब हमेशा चेतावनी नहीं देता है: "नोट पुनरावृत्ति आदेश की आजादी के कारण, पारदर्शी निष्पादन निर्धारिती परिणामों की गारंटी नहीं देता है।" – Andreas
इसका मतलब यह है कि पुनरावृत्ति किसी भी क्रम में किया जा सकता है। इसका आपके मामले पर कोई प्रभाव नहीं पड़ता है। – Oli