2012-01-02 11 views
5

मैं विभिन्न कोरों में एक ही समय में एकाधिक इनपुट को संसाधित करने के लिए सी ++ में एक एप्लिकेशन बनाने के लिए एक आर्किटेक्चर के लिए शोध कर रहा हूं। प्रत्येक इनपुट एक साथ एक कोर में संसाधित किया जाता है। कोर पर प्रत्येक प्रक्रिया, एक ही फ़िल्टर के माध्यम से संसाधित किया जाएगा। उदाहरण के लिए: filter1.apply(), filter2.apply() और filter3.apply()। प्रक्रियाओं नीचे के रूप में 4 आदानों के लिए 4 कोर के लिए दर्शाए गए हैं:कौन सा आर्किटेक्चर या डिज़ाइन पैटर्न इस एप्लिकेशन के लिए उपयुक्त हैं?

 
[core 1] [core 2] [core 3] [core 4] 
    |   |   |   |  
    V   V   V   V 
    input1  input2  input3  input4 
    |   |   |   |  
    V   V   V   V 
filter1 filter1  filter1 filter1 
    |   |   |   |  
    V   V   V   V 
filter2 filter2  filter2 filter2 
    |   |   |   |  
    V   V   V   V 
filter3 filter3  filter3 filter3 
    |   |   |   |  
    V   V   V   V 
output1 output2  output3 output4 

मैं जानता हूँ कि जो वास्तुकला या डिजाइन पैटर्न इस के लिए उपयुक्त है न। अगर आप मुझे कुछ और कलाकृतियों (दस्तावेज़ या नमूना आवेदन) को आगे पढ़ने के लिए देते हैं तो यह बहुत अच्छा होगा।

अग्रिम धन्यवाद।

+0

@Joachim: आपके संस्करण के लिए धन्यवाद। दरअसल, मैं इसे भी बेहतर बना रहा था :) – olidev

+0

बस एक साइड नोट के रूप में, ऐसा लगता है कि अगर आप फिल्टर अनुक्रम को एक ही फ़िल्टर में संकलित कर सकते हैं तो यह नेट जीत हो सकती है, क्योंकि आप हमेशा एक ही अनुक्रम कर रहे हैं चीजों की - ओपनजीएल में डिस्प्ले सूचियों की तरह थोड़ा। –

+0

फ़िल्टर को एक ही फ़िल्टर में संकलित करना अच्छा नहीं है क्योंकि फ़ंक्शन का दायरा (रेखाओं की संख्या) बहुत बड़ी है। और मैं भविष्य में इस वास्तुकला को नए फ़िल्टर जोड़ने की अधिक लचीला होना चाहता हूं। उदाहरण: फ़िल्टर 4 और फ़िल्टर 5 जोड़े गए हैं तो मैंने बस बस कॉल किया: filter1.apply(), filter2.apply(), filter3.apply(), filter4.apply() और filter5.apply()। – olidev

उत्तर

3

आमतौर पर ऐसे डिज़ाइन को लागू करने के लिए थ्रेड पूल का उपयोग किया जाता है। वे स्वतंत्र प्रक्रियाओं के लिए लगभग असीम पैमाने पर स्केल करते हैं। आप टीबीबी और पीपीएल में आसान कार्यान्वयन पा सकते हैं। वे कई मानक एल्गोरिदम और कंटेनरों के समवर्ती-संबंधित संस्करण प्रदान करते हैं। उदाहरण के लिए, इस नमूने में मैंने concurrent_vector का उपयोग किया है, जो एक vector-जैसी कंटेनर है जिसे कई धागे से सुरक्षित रूप से उत्परिवर्तित किया जा सकता है, और parallel_for_each, जो एक साथ कई धागे पर फ़ंक्शन चलाता है।

concurrent_vector<output> outputs; 
std::vector<input> inputs; 
parallel_for_each(inputs.begin(), inputs.end(), [](input& input) { 
    outputs.push_back(filter3(filter2(filter1(input)))); 
}); 
+0

बस कुछ जोड़ने के लिए, यदि आप पहले से नहीं जानते हैं कि आपके पास कितने पुनरावृत्तियों या कार्यों हैं, तो टीबीबी एक समान सुविधा भी प्रदान करता है जिसे parallel_do कहा जाता है जो "पूरा होने तक पकाता है"। – inf

+0

मुझे टीबीबी कहां मिल सकता है? – olidev

+0

मुझे यकीन नहीं है कि मैं इसका उपयोग करता हूं क्योंकि इस फ़िल्टर का इनपुट अगले फ़िल्टर का आउटपुट है। इनपुट एक छवि सरणी है लेकिन यह संघ नहीं है, वे या तो प्रकार के हो सकते हैं: int, float या char। मुझे नहीं पता कि यह एक उपयुक्त है या नहीं? – olidev

0

मुझे लगता है कि "रणनीति विधि" सहायक है। प्रत्येक कोर में, एक सदिश को एक वस्तु के रूप में प्रत्येक फिल्टर डालता है जैसे:

std::vector<filter> filters; 
तो

std::for_each(filters.begin(), filters.end(), [input&](f&){f.apply(input);}); 

================== ==

हम फ़िल्टर द्वारा पुन: इनपुट करते हैं, इनपुट नहीं। तो हम रनटाइम पर/डेल फ़िल्टर जोड़ सकते हैं।

की तरह:

class YourCore { 
public: 
    void add_filter(const filter& f) {m_filters.add(f);} 
    // void del_filter(int index); 
    // void del_filter(by name or UID, so change vector to map or unordered_map); 
private: 
    std::vector<filter> m_filters; 
}; 
संबंधित मुद्दे

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