c++ - Why is my for loop of cilk_spawn doing better than my cilk_for loop? -
मेरे पास
cilk_for (int i = 0; i & lt; 100; i ++) एक्स = फाइब (35); उपरोक्त 6.151 सेकंड लगते हैं
और
के लिए (int i = 0; i & lt; 100; i ++) x = Cilk_spawn फिब (35); लेता है 5.703 सेकंड
फाइब (x) भयानक पुनरावर्ती फिबोनाची संख्या फ़ंक्शन है। अगर मैं फाइबर फंक्शन cilk_for को डायल करता हूं तो cilk_spawn से बेहतर होता है, लेकिन मुझे लगता है कि fib (x) cilk_for < / code> को cilk_spawn से बेहतर करना चाहिए। मैं क्या समझ नहीं पा रहा हूं?
प्रति टिप्पणी के लिए, यह मुद्दा गुम सिल्का_एसआईएनसी था मैं उस पर विस्तार से बताऊंगा कि वास्तव में आश्चर्यजनक सटीकता के साथ समय का अनुपात कैसे अनुमानित किया जा सकता है।
/ cilk_spawn कोड के लिए पी हार्डवेयर धागे (आमतौर पर 7 पर i7) के साथ सिस्टम पर निष्पादित होगा निम्नानुसार:
- प्रारंभिक थ्रेड i = 0 के लिए चलना निष्पादित करेगा, और कुछ अन्य थ्रेड द्वारा चोरी होने वाली निरंतरता को छोड़ देगा।
- प्रत्येक चोर एक चलना चोरी करेगा और अगले चलने के लिए निरंतरता छोड़ दें।
- जब प्रत्येक चोर एक पुनरावृत्ति को खत्म कर लेता है, तो यह चरण 2 में वापस चला जाता है, जब तक कि चोरी करने के लिए कोई और बार फिर नहीं हो।
इस प्रकार धागे लूप हाथ से अधिक हाथ निष्पादित करेगा, और पाश एक बिंदु पर निकलता है, जहां पी -1 थ्रेड अभी भी पुनरावृत्तियों पर काम कर रहे हैं। इसलिए केवल (100-पी -1) पुनरावृत्तियों का मूल्यांकन करने के बाद पाश को समाप्त करने की उम्मीद की जा सकती है।
इसलिए 8 हार्डवेयर धागे के लिए, cilk_sync गुम होने के लिए / cilk_spawn के लिए समय के बारे में 9 93/100 के बारे में 5.703 / 6.151 = 0.927 के मनाया अनुपात के करीब cilk_for।
इसके विपरीत, टीबीबी या पीपीएल कार्यसमूह जैसे "चाइल्ड स्टिल" प्रणाली में, पाश पूरा करने की दौड़, 100 कार्य करते हैं, और तब task_group :: wait के लिए कॉल तक चलते रहें। उस स्थिति में, सिंक्रनाइज़ेशन को भूल जाने से समय का एक और अधिक नाटकीय अनुपात होता।
Comments
Post a Comment