क्या C ++ 17 समानांतर `for_each` के लिए थ्रेड्स की गिनती सीमित करना संभव है?


10

मैं उपयोग std::for_eachके साथ std::execution::parसंरचनाओं के वेक्टर के रूप में प्रतिनिधित्व विशाल इनपुट पर जटिल गणना करने के लिए। अभिकलन को हार्डवेयर (नेटवर्क या डिस्क IO उदाहरण के लिए) से संबंधित किसी भी देरी की आवश्यकता नहीं है, यह "सिर्फ सीपीयू" अभिकलन है। मेरे लिए यह तर्कसंगत लगता है कि अधिक ओएस थ्रेड बनाने के लिए कोई अर्थ नहीं है जो हमारे पास हार्डवेयर वाले हैं; हालाँकि, Visual C ++ 2019 औसत 50 थ्रेड्स बनाता है, और कभी-कभी 500 तक भी केवल 12 हार्डवेयर थ्रेड होते हैं।

वहाँ के लिए गिनती समानांतर धागे सीमित करने के लिए एक रास्ता है hardware_concurrencyसाथ std::for_eachऔर std::execution::parएक ही तरीका उचित धागे बनाने के लिए गिनती के साथ प्रयोग के कस्टम कोड के लिए किया जाता है, या std::thread?


open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - लेकिन मुझे लगता है कि यह अभी भी एक प्रस्ताव है?
कैरामिरियल

1
भले ही यह किसी दिन मानक बन जाएगा, थ्रेड पूल मुख्य मुद्दा यह है कि यह हेडर std::for_eachसे अन्य एल्गोरिदम की तुलना में बहुत कम स्तर है <algorithm>। मुख्य विचार के पीछे std::execution::parअनुक्रमिक के रूप में सरल के रूप में समानांतर कोड बना रहा है, और कम से कम कोड और शब्दार्थ परिवर्तन के साथ मौजूदा एल्गोरिदम के समानांतर।
विटाली

जवाबों:


5

क्या सी ++ 17 समानांतर के लिए थ्रेड्स की गिनती को सीमित करना संभव है for_each?

नहीं, कम से कम C ++ 17 में नहीं। हालांकि, executorsआने वाले एक मानक के लिए एक प्रस्ताव है , जो मूल रूप से आपको उच्च-स्तरीय एसटीएल एल्गोरिदम इंटरफ़ेस के लिए निष्पादन संदर्भ (स्थान और समय के संदर्भ में) को प्रभावित करने की क्षमता देता है:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

तब तक, आप या तो विश्वास करने के लिए है अपने संकलक विक्रेता वह जानता है कि क्या, समग्र प्रदर्शन के लिए सबसे अच्छा है जैसे के रूप में दृश्य स्टूडियो के डेवलपर्स राज्य :

हमारे कार्यान्वयन में निर्धारण को विंडोज सिस्टम थ्रेड पूल द्वारा नियंत्रित किया जाता है। थ्रेड पूल मानक लाइब्रेरी के लिए उपलब्ध जानकारी का लाभ नहीं उठाता है, जैसे कि सिस्टम पर अन्य थ्रेड्स क्या कर रहे हैं, किन कर्नेल संसाधन थ्रेड्स की प्रतीक्षा कर रहे हैं, और इसी तरह। यह चुनता है कि कब अधिक धागे बनाने हैं, और कब उन्हें समाप्त करना है। यह अन्य सिस्टम घटकों के साथ भी साझा किया जाता है, जिनमें C ++ का उपयोग नहीं करना शामिल है।

अन्य विकल्प केवल मानक पुस्तकालय पर निर्भर रहने और एसटीएल कार्यान्वयन का उपयोग करना होगा जो पहले से ही नए प्रस्ताव को प्रस्तुत करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.