2015-12-12 9 views
5

निम्नलिखित कोड के लिए, यहां कुछ संदर्भ है।ओपनसीवी सी ++ मल्टीथ्रेडिंग स्पीडअप

Mat img0; // 1280x960 grayscale 

-

timer.start(); 
for (int i = 0; i < img0.rows; i++) 
{ 
    vector<double> v; 
    uchar* p = img0.ptr<uchar>(i); 
    for (int j = 0; j < img0.cols; ++j) 
    { 
     v.push_back(p[j]); 
    } 
} 
cout << "Single thread " << timer.end() << endl; 

और

timer.start(); 
concurrency::parallel_for(0, img0.rows, [&img0](int i) { 
    vector<double> v; 
    uchar* p = img0.ptr<uchar>(i); 
    for (int j = 0; j < img0.cols; ++j) 
    { 
     v.push_back(p[j]); 
    } 
}); 
cout << "Multi thread " << timer.end() << endl; 
परिणाम

:

Single thread 0.0458856 
Multi thread 0.0329856 

speedup शायद ही ध्यान देने योग्य है।

मेरे प्रोसेसर इंटेल i5 3.10 गीगा

रैम 8 जीबी DDR3

संपादित

मैं भी एक अलग दृष्टिकोण की कोशिश की है।

vector<Mat> imgs = split(img0, 2,1); // `split` is my custom function that, in this case, splits `img0` into two images, its left and right half 

-

timer.start(); 
concurrency::parallel_for(0, (int)imgs.size(), [imgs](int i) { 
    Mat img = imgs[i]; 
    vector<double> v; 
    for (int row = 0; row < img.rows; row++) 
    { 
     uchar* p = img.ptr<uchar>(row); 
     for (int col = 0; col < img.cols; ++col) 
     { 
      v.push_back(p[col]); 
     } 
    } 

}); 
cout << " Multi thread Sectored " << timer.end() << endl; 

और मैं ज्यादा बेहतर परिणाम प्राप्त:

Multi thread Sectored 0.0232881 

तो, ऐसा लगता है कि मैं 960 धागे या कुछ बनाने रहा था जब मैं

parallel_for(0, img0.rows, ... 
भाग गया

और यह अच्छी तरह से काम नहीं किया।

(मुझे यह जोड़ना होगा कि केनी की टिप्पणी सही है। मैंने यहां बताई गई विशिष्ट संख्याओं के लिए बहुत अधिक प्रासंगिकता न डालें। इस तरह के छोटे अंतराल को मापते समय, उच्च भिन्नताएं होती हैं। लेकिन आम तौर पर, मैंने जो लिखा संपादित करें, आधे में छवि को विभाजित करने के बारे में, पुराने दृष्टिकोण की तुलना में बेहतर प्रदर्शन।)

+1

मल्टीथ्रेडिंग में ओवरहेड शामिल है; कुछ बड़े या अधिक CPU तीव्रता के साथ प्रयास करें, ताकि चलने का समय दूसरे (या कम से कम 0.1 सेकंड) के क्रम में हो। मुझे लगता है कि आप तब एक बड़ा speedup देखेंगे। – Kenney

+0

हां, यह सच है। मुझे मिलने वाले समय जंगली रूप से भिन्न होते हैं। अब मैं उनसे चिपक रहा हूं क्योंकि मैं प्रश्न में सभी कोड बदलना नहीं चाहता हूं। – ancajic

उत्तर

1

मुझे लगता है कि आपकी समस्या यह है कि आप स्मृति बैंडविड्थ द्वारा सीमित हैं। आपका दूसरा स्निपेट मूल रूप से पूरी छवि से पढ़ रहा है, और इसे मुख्य स्मृति से कैश में बाहर आना है। (या एल 1 कैश में एल 2 कैश से बाहर)।

आपको अपना कोड व्यवस्थित करने की आवश्यकता है ताकि सभी चार कोर एक ही समय में एक ही बिट मेमोरी पर काम कर रहे हों (मुझे लगता है कि आप वास्तव में इस कोड को अनुकूलित करने का प्रयास नहीं कर रहे हैं - यह केवल एक साधारण उदाहरण है)।

संपादित करें: अंतिम मूलभूत टिप्पणी में महत्वपूर्ण "नहीं" डालें।

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