boost इंटेल टीबीबी बनाम बूस्ट




boost-thread tbb (2)

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

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


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


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

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