2011-08-20 16 views
28

मैं अपने नए एप्लिकेशन में बहु-थ्रेडिंग के लिए लाइब्रेरी के उपयोग का निर्णय लेने में लचीलापन है। अब तक मैं pthread का उपयोग कर रहा था। अब क्रॉस प्लेटफार्म लाइब्रेरी का पता लगाना चाहते हैं। मैं टीबीबी और बूस्ट पर शून्य हूं। मुझे समझ में नहीं आया कि बूस्ट पर टीबीबी का क्या फायदा है। विकी के लिए TBB अंशः कार्यों "है, जो गतिशील रूप से पुस्तकालय के द्वारा अलग-अलग कोर के लिए आवंटित कर रहे हैं" इसके बजाय पुस्तकालय सार आपरेशन के रूप में इलाज किया जा करने की अनुमति देकर कई प्रोसेसर के लिए पहुँच ": मैं बूस्ट अधिक TBB का लाभ पता लगाने के लिए कोशिश कर रहा हूँ रन-टाइम इंजन, और कैश के कुशल उपयोग को स्वचालित करके। एक TBB कार्यक्रम बनाता है, सिंक्रनाइज़ करता है और एल्गोरिदम के अनुसार निर्भर कार्यों के रेखांकन को नष्ट कर देता, "इंटेल टीबीबी बनाम बूस्ट

लेकिन फिर भी कोर के धागे के आवंटन के बारे में चिंता करने की जरूरत पुस्तकालय सूत्रण है । क्या यह ऑपरेटिंग सिस्टम का काम नहीं है? तो बूस्ट पर टीबीबी का उपयोग करने का असली बेनिफिट क्या है?

+0

आप पथ्रेड का उपयोग करके थ्रेड एफ़िनिटीज सेट कर सकते हैं (उदाहरण के लिए pthread_setaffinity_np कॉल का उपयोग करके) –

+0

@ फ़ू हाँ सही हैं। मेरा मुद्दा यह है कि ऐसा करने का व्यावहारिक उपयोग कितना है। एक प्रोग्रामर के रूप में आप अपने आवेदन पर थ्रेड शेड्यूलिंग कार्य नहीं करना चाहते हैं। तो क्यों टीबीबी इसे अन्य पुस्तकालय पर एक भिन्नता के रूप में दिखाता है? – David

+4

अनुप्रयोगों के लिए कोर चुनने के लिए एक अवलोकन योग्य लाभ है। थ्रेडेड लॉगर का सरल उदाहरण लें। एक थ्रेड को नेटवर्क इंटरफेस से डेटा प्राप्त होता है और इसे एक अंगूठी पर रखता है; दूसरा धागा अंगूठी से पढ़ता है और एक फाइल को लिखता है (इससे आप को देखने में मदद मिलती है जो आप देखते हैं कि आप टीसीपीडम्प का उपयोग करते हैं)। इस मामले में, एक दोहरी प्रोसेसर प्रणाली पर, एक ही सीपीयू पर affinities सेटिंग अधिक कुशलता से है।यदि आपके पास हाइपरथ्रेडिंग सक्षम है, तो वर्चुअल कोर जोड़ी का उपयोग करना बहुत तेज़ है। हालांकि, इसके लिए बहुत से माइक्रोमैंजमेंट की आवश्यकता होती है, जिसे टीबीबी की आवश्यकता नहीं होती है। –

उत्तर

31

लेकिन थ्रेडिंग लाइब्रेरी को थ्रेड के आवंटन के बारे में भी चिंता करने की आवश्यकता है। क्या यह ऑपरेटिंग सिस्टम का काम नहीं है? तो बूस्ट पर टीबीबी का उपयोग करने का वास्तविक बेनिफिट क्या है?

आप सही हैं, थ्रेडिंग लाइब्रेरी को आम तौर पर कोर को थ्रेड करने के बारे में परवाह नहीं करना चाहिए। और टीबीबी नहीं करता है। टीबीबी कार्यों के साथ काम करता है, धागे नहीं। टीबीबी का शेड्यूलर धागे के पूल को आवंटित करके सभी कोरों का उपयोग करता है और इसे गतिशील रूप से चुनने देता है कि कौन से कार्यों को चलाने के लिए। बूस्ट पर यह मुख्य लाभ है, जिसके साथ आपको मैन्युअल रूप से थ्रेड पर उपलब्ध काम को मैप करने की आवश्यकता होगी। और फिर टीबीबी उच्च-स्तरीय संरचनाएं प्रदान करता है जैसे समानांतर_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 स्वचालित रूप से उपलब्ध कोर भर में पाश पुनरावृत्तियों वितरित करेंगे (और आपको परेशान नहीं है कि कितने) और गतिशील भार को संतुलित करें तो टी टोपी अगर कुछ थ्रेड करने के लिए और अधिक काम है, तो अन्य धागे सिर्फ इसके लिए इंतजार नहीं करते हैं बल्कि सीपीयू उपयोग को अधिकतम करने में मदद करते हैं। इसे कच्चे धागे के साथ कार्यान्वित करने का प्रयास करें, और आप अंतर महसूस करेंगे :)

+0

@ एलेक्सी धन्यवाद एक अच्छा स्पष्टीकरण के लिए। अब मैं टीबीबी आशाजनक लग रहा है। क्या आप कृपया टीबीबी के लिए कुछ ट्यूटोरियल सुझा सकते हैं? – David

+0

http://threadingbuildingblocks.org/documentation.php –

+0

पर देखें क्या आप मुझे बता सकते हैं '[=]' यह कैप्चर करता है? – user

8

इंटेल TBB में लाता है अपने आप थ्रेड पूल/अनुसूचक और (parallel_for निर्माणों की तरह सामान सहित) निष्पादन मॉडल जबकि बूस्ट केवल बुनियादी धागा प्रबंधन कार्यों (धागे और तुल्यकालन पुरातन बनाने के लिए, बस इतना ही।) एक अच्छा थ्रेड पूल बूस्ट का उपयोग कर लेखन है संभव है, लेकिन मुश्किल - टीबीबी पहले से ही एक बेहद अनुकूलित थ्रेड पूल के साथ आता है। तो यह पूरी तरह से आपकी आवश्यकताओं पर निर्भर करता है: यदि आपको केवल "पोर्टेबल पाथ्रेड" की आवश्यकता है, तो बूस्ट का उपयोग करें, यदि आपको और अधिक चाहिए, तो इंटेल टीबीबी का उपयोग करें।

+0

जानकारी बढ़ाने के लिए धन्यवाद :: थ्रेडपूल का मतलब है बूस्ट में थ्रेडपूल सामान करने के लिए। तो यह थ्रेड पूल रखने का एक तरीका प्रदान करता है। जो चीज़ मुझे नहीं पता वह टीबीबी की तुलना में कितनी कुशल/कमी है? – David

+1

बूस्ट :: थ्रेडपूल काफी समय से निष्क्रिय है और _by far_ इंटेल टीबीबी के रूप में शक्तिशाली नहीं है। – Anteru

+2

@ एंटरू: मुझे लगता है कि उसका मतलब था ['boost :: thread_group'] (http://www.boost.org/doc/libs/release/doc/html/thread/thread_management.html#thread.thread_management.threadgroup), लेकिन आप सही हैं - बूस्ट की कक्षा सिर्फ एक धागा कंटेनर है, और टीबीबी की तरह अंतर्निहित शेड्यूलिंग की पेशकश नहीं करता है। – ildjarn

संबंधित मुद्दे