2012-10-21 7 views
6

तो, मैं थ्रेड के साथ कुछ बेंचमार्क परीक्षण कर रहा था, और मैंने कोड के इन टुकड़े लिखे थे:सीरियल कोड सी में केवल एक धागे का उपयोग करने से बहुत धीमी है?

resp_threadless [] और resp_threaded [] वैश्विक int arrays हैं और उनका आकार n है;

function(); 

और दूसरा एक इस तरह::

HANDLE hThreadArray[1]; 
DWORD dwThreads[1]; 
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0])); 
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE); 
CloseHandle(hThreadArray[0]); 

ध्यान रखें मुझे पता है कि कि function_th का उपयोग कर एक से अधिक थ्रेड बुला

int n = 100000; 

void function() { 
    for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

DWORD WINAPI function_th(LPVOID lpParam) { 
for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

मैं सिर्फ उसे फोन करके पहले समारोह बेंचमार्क() इसे समानांतर नहीं करेगा, यह सिर्फ एक परीक्षण है क्योंकि मुझे वास्तव में अजीब परिणाम मिल रहे थे, इसलिए मैंने यह देखने का फैसला किया कि एक थ्रेड के साथ क्या होगा और एक ही कोड का उपयोग करके एक फ़ंक्शन होगा। का उपयोग करते हुए इसी तरह के परिणाम 425 एमएस

मैं लिया है: सीरियल कोड: 1485 एमएस एक धागा NUMPROC = 1.

परिणाम के साथ

मैं एक इंटेल एटॉम N270 में यह परीक्षण किया है, और खिड़कियों XP मल्टीप्रोसेसर मशीनें, और धागे द्वारा किए गए काम को समानांतर करने के लिए सेमफोर का उपयोग करके कोड के साथ भी।

क्या किसी को भी पता चल सकता है कि क्या हो सकता है?

संपादित

, आदेश Inverting कई बार हर एक, आदि चल रहा है ... -> कोई परिवर्तन नहीं

उच्चतर एन -> थ्रेड एक आनुपातिक भी तेजी से

QueryPerformanceCounter (का उपयोग करना है) -> कोई परिवर्तन नहीं

धागा निर्माण ओवरहेड -> पिरोया एक भी धीमी, नहीं तेजी से करना चाहिए

01,235,

मूल कोड: http://pastebin.com/tgmp5p1G

+0

शायद आपका वर्तमान धागा (जिसमें आप 'फ़ंक्शन() 'का आह्वान करते हैं) कम प्राथमिकता है? – SomeWittyUsername

+2

क्या आपने एक प्रोग्राम निष्पादन में अनुक्रमिक रूप से दो परीक्षण चलाए? मुझे 'vetor []' पहुंच के लिए डेटा कैश प्रभाव पर संदेह है। – yohjp

+0

1. क्या आपने ऑर्डर को रिवर्स करने का प्रयास किया है, पहले थ्रेड और फ़ंक्शन के बाद? (कैश प्रभाव) 2. आपने समय को कैसे माप लिया? – Arno

उत्तर

2

यह cache hit मामला है। मुझे संदेह है कि आपने अपने प्रश्न में वर्णित क्रम में बेंचमार्क किया था। समारोह को पहले कहा जाता था और थ्रेड को बाद में बुलाया गया था। जब आप इसे अधिक विस्तार से बेंचमार्क करते हैं, तो आप कारण देखेंगे: डेटा (वर्ग) कैश में availabel है, इस प्रकार कोड बहुत तेज निष्पादित करेगा। टेस्ट proove करने:

  1. धागा कॉल करने से पहले दो बार या यहाँ तक कि function() भागो अधिक बार। फ़ंक्शन करने वाला दूसरा कॉल पहले से ही त्वरित परिणाम देगा।
  2. फ़ंक्शन से पहले थ्रेड को कॉल करें और आपका परिणाम विपरीत दिखाएगा। फ़ंक्शन बेहतर परिणाम दिखाएगा।

कारण: सभी वर्ग गणना (या कम से कम उनमें से बहुत सारे) कैश में उपलब्ध हैं और फिर से गणना नहीं की जानी चाहिए। यह बहुत तेज़ है।

+0

मैंने दोनों को उलटाने की कोशिश की है, उनमें से कई बार चल रहा है, और मुझे एक ही परिणाम मिल गया है। – ruback

+0

ठीक है, मैंने आपके कोड का उपयोग किया और उस पर असाधारण किया। और परिणाम बहुत स्पष्ट थे। ** फिर से: ** आपने समय माप कैसे किया? क्या आप 'फ़ंक्शन() 'और' function_th() 'के लगातार 5 रनों के लिए समय की रिपोर्ट कर सकते हैं? – Arno

+0

मैं वास्तव में प्रत्येक समारोह में 5 बार चल रहा हूं और इसका मतलब प्राप्त कर रहा हूं। मैं समय प्राप्त कर रहा हूं "(डबल) घड़ी()/CLOCKS_PER_SEC;" और दूसरे से एक घटाना। – ruback