मेरे पास एक साधारण प्रोग्राम है जो कुछ मोंटे कार्लो एल्गोरिदम करता है। एल्गोरिदम के साथ एक पुनरावृत्ति दुष्प्रभावों के बिना है, इसलिए मुझे इसे कई धागे से चलाने में सक्षम होना चाहिए।एकाधिक धागे का उपयोग करते समय प्रोग्राम धीमा होता है
void task(unsigned int max_iter, std::vector<unsigned int> *results, std::vector<unsigned int>::iterator iterator) {
for (unsigned int n = 0; n < max_iter; ++n) {
nume::Album album(535);
unsigned int steps = album.fill_up();
*iterator = steps;
++iterator;
}
}
void aufgabe2() {
std::cout << "\nAufgabe 2\n";
unsigned int max_iter = 10000;
unsigned int thread_count = 4;
std::vector<std::thread> threads(thread_count);
std::vector<unsigned int> results(max_iter);
std::cout << "Computing with " << thread_count << " threads" << std::endl;
int i = 0;
for (std::thread &thread: threads) {
std::vector<unsigned int>::iterator start = results.begin() + max_iter/thread_count * i;
thread = std::thread(task, max_iter/thread_count, &results, start);
i++;
}
for (std::thread &thread: threads) {
thread.join();
}
std::ofstream out;
out.open("out-2a.csv");
for (unsigned int count: results) {
out << count << std::endl;
}
out.close();
std::cout << "Siehe Plot" << std::endl;
}
पेचीदा बात यह है कि यह धीमी अधिक धागे मैं जोड़ने हो जाता है: तो यह my whole program के संबंधित भाग, जो सी ++ 11 में लिखा है।
real 0m5.691s
user 0m3.784s
sys 0m10.844s
किसी एकल थ्रेड के साथ जबकि:: 4 धागे के साथ, मैं इस मिल
real 0m1.145s
user 0m0.816s
sys 0m0.320s
मुझे लगता है कि सीपीयू कोर के बीच डेटा ले भूमि के ऊपर जोड़ सकते हैं, लेकिन vector
स्टार्टअप पर घोषित किया जाना चाहिए, और बीच में संशोधित नहीं किया जा सकता है। क्या एकाधिक कोर पर धीमा होने का कोई विशेष कारण है?
मेरे प्रणाली एक i5-2550M है, जो 4 कोर (2 + Hyperthreading) है और मैं जी का उपयोग ++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
अद्यतन
मुझे लगता है कि देखा कोई सूत्र का उपयोग कर (1), यह उपयोगकर्ता लोड का एक बहुत होगा, जबकि धागे के साथ (2), यह उपयोगकर्ता लोड से ज्यादा गिरी होगा:
10K चलाता है:
http://wstaw.org/m/2013/05/08/stats3.png
100K चलाता है:
http://wstaw.org/m/2013/05/08/Auswahl_001.png
100K रन के साथ, मैं निम्नलिखित मिल:
कोई सूत्र बिल्कुल:
real 0m28.705s
user 0m28.468s
sys 0m0.112s
के प्रत्येक भाग के लिए एक धागा कार्यक्रम। वे भाग एक ही स्मृति का उपयोग भी नहीं करते हैं, इसलिए मैं एक ही कंटेनर के लिए समेकन भी बाहर होना चाहिए। लेकिन यह जिस तरह से अधिक समय लगता है:
real 2m50.609s
user 2m45.664s
sys 4m35.772s
इसलिए हालांकि तीन मुख्य भागों मेरी सीपीयू की 300% तक का समय लग, वे 6 बार जब तक ले।
1 एम रन के साथ, यह real 4m45
करने के लिए लिया। मैं पहले 1 एम भाग गया, और कम से कम real 20m
लिया, अगर real 30m
भी नहीं।
'10000' वास्तव में छोटा है ... एक बड़ी संख्या का प्रयास करें। – UmNyobe
शायद संदर्भ स्विच ओवरहेड कार्य को पूरा करने के लिए आवश्यक समय पर हावी है। जैसा कि सुझाव दिया गया है, उस '10000' पर कुछ शून्य जोड़ें ... –
धागे बनाना भी ओवरहेड है। कार्य को एक सरल 'वापसी' करने दें और देखें कि उनमें से कितनी संख्या वास्तविक गणना थी। धागे को बिल्कुल भी बनाने की कोशिश न करें (केवल कार्य फ़ंक्शन को वर्तमान से चलाएं), इसे और भी तेज होना चाहिए। थ्रेड लॉन्च करने के लिए ओएस को क्या करना है, इसकी तुलना में 10 के पुनरावृत्तियों शायद कुछ भी नहीं हैं। – hamstergene