लेकिन थ्रेडिंग लाइब्रेरी को थ्रेड के आवंटन के बारे में भी चिंता करने की आवश्यकता है। क्या यह ऑपरेटिंग सिस्टम का काम नहीं है? तो बूस्ट पर टीबीबी का उपयोग करने का वास्तविक बेनिफिट क्या है?
आप सही हैं, थ्रेडिंग लाइब्रेरी को आम तौर पर कोर को थ्रेड करने के बारे में परवाह नहीं करना चाहिए। और टीबीबी नहीं करता है। टीबीबी कार्यों के साथ काम करता है, धागे नहीं। टीबीबी का शेड्यूलर धागे के पूल को आवंटित करके सभी कोरों का उपयोग करता है और इसे गतिशील रूप से चुनने देता है कि कौन से कार्यों को चलाने के लिए। बूस्ट पर यह मुख्य लाभ है, जिसके साथ आपको मैन्युअल रूप से थ्रेड पर उपलब्ध काम को मैप करने की आवश्यकता होगी। और फिर टीबीबी उच्च-स्तरीय संरचनाएं प्रदान करता है जैसे समानांतर_for, समानांतर_पिपलाइन, इत्यादि जिनका उपयोग सबसे आम समांतर पैटर्न व्यक्त करने के लिए किया जा सकता है, और कार्यों के साथ सभी कुशलता को छिपा सकता है।
उदाहरण के लिए, कोड है कि मैंडलब्रॉट भग्न के अंक की गणना करता है का एक टुकड़ा ले जाने (http://warp.povusers.org/Mandelbrot/ से लिया, चर प्रारंभ छोड़े गए):
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
bool isInside = true;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = false;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { putpixel(x, y); }
}
}
अब यह TBB साथ समानांतर बनाने के लिए, आप सभी की जरूरत कन्वर्ट करने के लिए है TBB में सबसे बाहरी पाश :: parallel_for (मैं संक्षिप्तता के लिए एक सी ++ 11 लैम्ब्डा का उपयोग करें):
tbb::parallel_for(0, ImageHeight, [=](unsigned y)
{
// the rest of code is exactly the same
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
...
// if putpixel() is not thread safe, a lock might be needed
if(isInside) { putpixel(x, y); }
}
});
TBB स्वचालित रूप से उपलब्ध कोर भर में पाश पुनरावृत्तियों वितरित करेंगे (और आपको परेशान नहीं है कि कितने) और गतिशील भार को संतुलित करें तो टी टोपी अगर कुछ थ्रेड करने के लिए और अधिक काम है, तो अन्य धागे सिर्फ इसके लिए इंतजार नहीं करते हैं बल्कि सीपीयू उपयोग को अधिकतम करने में मदद करते हैं। इसे कच्चे धागे के साथ कार्यान्वित करने का प्रयास करें, और आप अंतर महसूस करेंगे :)
स्रोत
2011-08-20 20:22:06
आप पथ्रेड का उपयोग करके थ्रेड एफ़िनिटीज सेट कर सकते हैं (उदाहरण के लिए pthread_setaffinity_np कॉल का उपयोग करके) –
@ फ़ू हाँ सही हैं। मेरा मुद्दा यह है कि ऐसा करने का व्यावहारिक उपयोग कितना है। एक प्रोग्रामर के रूप में आप अपने आवेदन पर थ्रेड शेड्यूलिंग कार्य नहीं करना चाहते हैं। तो क्यों टीबीबी इसे अन्य पुस्तकालय पर एक भिन्नता के रूप में दिखाता है? – David
अनुप्रयोगों के लिए कोर चुनने के लिए एक अवलोकन योग्य लाभ है। थ्रेडेड लॉगर का सरल उदाहरण लें। एक थ्रेड को नेटवर्क इंटरफेस से डेटा प्राप्त होता है और इसे एक अंगूठी पर रखता है; दूसरा धागा अंगूठी से पढ़ता है और एक फाइल को लिखता है (इससे आप को देखने में मदद मिलती है जो आप देखते हैं कि आप टीसीपीडम्प का उपयोग करते हैं)। इस मामले में, एक दोहरी प्रोसेसर प्रणाली पर, एक ही सीपीयू पर affinities सेटिंग अधिक कुशलता से है।यदि आपके पास हाइपरथ्रेडिंग सक्षम है, तो वर्चुअल कोर जोड़ी का उपयोग करना बहुत तेज़ है। हालांकि, इसके लिए बहुत से माइक्रोमैंजमेंट की आवश्यकता होती है, जिसे टीबीबी की आवश्यकता नहीं होती है। –