2009-12-08 14 views
5

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

#include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 

    int main (int argc, char** argv){ 
     double Random(); 

     int k,NUM_ITERATIONS = 10; 
     clock_t start_time = clock(); 
     NUM_ITERATIONS=atoi(argv[1]); 

     // iniciranje random generatora 
     srand(time(NULL)); 

     for(k=0; k<NUM_ITERATIONS; k++){ 
       double raa = Random(); 
     } 
     clock_t end_time = clock(); 
    printf("Time of algorithm execution: %lf seconds\n", ((double) (end_time - start_time))/CLOCKS_PER_SEC); 

    return 0; 
    } 

    // generate random number bettwen 0 and 1 
    double Random(){ 
     srand(rand()); 
     double a = rand(); 
     return a/RAND_MAX; 
    } 

अगर मैं 100 000 000 NUM_ITERATIONS के लिए तर्क के रूप में साथ निष्पादित, मैं खिड़कियों पर की तुलना में लिनक्स पर 20 बार धीमी निष्पादन मिलता है। दोहरी बूट जीत + ubuntu linux के साथ एक ही वास्तुकला के साथ मशीन पर परीक्षण किया। हमें मदद चाहिए क्योंकि इस रैंडम फ़ंक्शन को हमारे डेटा के साथ दिखाना चाहते हैं, इसके लिए बाधा है।

+0

लिनक्स में इसे संकलित करते समय आप जीसीसी को क्या कमांड लाइन विकल्प पास कर रहे हैं, और विंडोज़ में कौन से विकल्प उपयोग किए जा रहे हैं। –

+0

"gcc -o rand rand.c -lm" दोनों प्रणालियों पर। – Zec

+2

जो भी यादृच्छिक संख्या जनरेटर आप समाप्त करते हैं, उसे ** एक बार ** प्रोग्राम चलाने के लिए शुरू करें। ** केवल एक बार! ** – pmg

उत्तर

1

मैं अन्य यादृच्छिक संख्या जेनरेटर उपलब्ध कराऊंगा। कई मौजूद हैं जो निष्पादन की गति और छद्म-यादृच्छिकता के संदर्भ में मानक पुस्तकालय यादृच्छिक कार्यों से बेहतर परीक्षण और प्रदर्शन करते हैं। मैंने स्नातक वर्ग के लिए अपना खुद का आरएनजी भी लागू किया है, लेकिन मैं इसे उत्पादन कोड में उपयोग नहीं करता। उस समुदाय के साथ जाएं जो समुदाय द्वारा प्रस्तुत किया गया है। Random.org आपके द्वारा चुने गए आरएनजी का परीक्षण करने के लिए एक अच्छा संसाधन है।

8

लिनक्स जीसीसी पर, यादृच्छिक फ़ंक्शन के भीतर srand(rand()); पर कॉल 98% से अधिक समय के लिए खाते हैं।

कम से कम लूप के भीतर यादृच्छिक संख्याओं की पीढ़ी के लिए इसकी आवश्यकता नहीं है। आप पहले ही srand() पर कॉल कर चुके हैं, यह पर्याप्त है।

+0

हमें हर समय बीज बदलने की जरूरत है। शून्य srand (हस्ताक्षरित int बीज); छद्म-यादृच्छिक संख्या जेनरेटर बीज के रूप में पारित तर्क का उपयोग करके प्रारंभ किया गया है। एसआरएंड को कॉल में इस्तेमाल किए गए प्रत्येक अलग-अलग बीज मूल्य के लिए, छद्म-यादृच्छिक संख्या जनरेटर से बाद में कॉल में परिणाम के अलग-अलग उत्तराधिकार उत्पन्न होने की उम्मीद की जा सकती है। एक ही बीज के साथ दो अलग-अलग प्रारंभिकरण, छद्म-यादृच्छिक जनरेटर को दोनों मामलों में रैंड के बाद के कॉल के परिणामों के समान उत्तराधिकार उत्पन्न करने के लिए निर्देशित करता है। – Zec

+3

@ZeKoU - मैं यह नहीं कह रहा कि आप गलत हैं, लेकिन यह कोड काफी खराब है। मुझे लगता है (लेकिन मुझे यकीन नहीं है) कि आप एक निर्धारक या अनुमानित अनुक्रम उत्पन्न कर सकते हैं। 'Srand' के अंदर 'रैंड' पहला कॉल हमेशा एक ही मूल्य के साथ बीज srand जा रहा है। वहां से, मुझे लगता है कि एक हमलावर आपके कर को फिर से चला सकता है। मेरा मानना ​​है कि dtrosset सही है। इसके अतिरिक्त, आप 'srand (समय (NULL)) को इसके बजाय कॉल करना चाहते हैं: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random- संख्या-साथ-रैंड –

+0

यह नहीं हुआ कि int randPrime() {वापसी srand (रैंड()), रैंड();} ? – ima