2012-02-06 28 views
7

हैलो मैं है -fopenmp ध्वज के साथ निम्नलिखित कोड है, जो मैं जीसीसी (> 4.2) के साथ संकलन:OpenMP अजीब व्यवहार

int main(void) 
{ 
#pragma omp parallel for 
    int i; 
    for(i=0;i<4;i++) while(1); 

    return 0; 
} 

मैं OSX शेर पर एक SIGSEGV (प्राप्त ver 1.7.3, LLVM-जीसीसी 4.2.1) और सेंटोस 6.2। मुझसे यहां क्या गलत हो रहा है? धन्यवाद

+0

मुझे वही मिलता है, Win7/cygwin, gcc 4.5.0। हालांकि मैंने इसे चलाया हालांकि जीडीबी: यह धागे बनाता है और फिर मुझे 'प्रोग्राम सिग्नल सिग्सेजीवी, सेगमेंटेशन गलती मिली। Ox_get_max_active_levels() '0x63602726 में। यह 'जबकि (1) 'के बिना ठीक चलाता है। ओपनएमपी अनंत अनंत लूप का इलाज कैसे कर रहा है? –

+0

आप एक अविकसित चर का उपयोग कर रहे हैं। लेकिन यह एक संकलन त्रुटि उत्पन्न करना चाहिए, एक segfault नहीं। लेकिन 'i' घोषित के साथ मुझे एक सेगफॉल्ट भी मिलता है, जीसीसी-4.5.1, ओपनएसयूएसई 11.4। –

+0

मैं जोड़ना भूल गया .. int i .. मैंने जल्दी में कोड लिखा: डी। – sfa

उत्तर

1

इस मुद्दे के बारे में जीसीसी में एक बग था, मैंने इसकी सूचना दी और वे एक फिक्स प्रदान करेंगे। यहां लिंक है: GCC bug

1

बहुत रोचक।

मैं कोड एक छोटे से बदल तो

int main(void) 
{ 
int i; 
#pragma omp parallel 
    { 
     while(1); 
    } 
    return 0; 
} 

और इतने

inline void func() { 
    while (1) ; 
} 

int main(void) 
{ 
int i; 
#pragma omp parallel for 
    for(i=0;i<8;i++) { 
     func(); 
    } 
    return 0; 
} 

और वे दोनों ठीक काम किया।

+0

मुझे पता है, मैंने बाद वाले को भी आजमाया। (इनलाइन के बिना भी काम करता है)। लेकिन आपके द्वारा लिखे गए कोड के साथ आपको क्या लगता है, (इसके अलावा एक गायब है ... int i)। मेरे CentOS gomp_loop_static_start() पर, => chunk_size = 140737488347560, istart = 0x7fffffffe1b0, iend = 0xca जैसे पैरामीटर के साथ कॉल किया जाता है। आखिरी वाला एक सूचक है जो संदर्भित हो जाता है .. इसलिए SIGSEGV प्राप्त करना। यदि मैं स्पष्ट रूप से शेंक आकार को किसी मान पर सेट करने के लिए शेड्यूल() का उपयोग करता हूं, तो आईंड पॉइंटर एक मान्य पता है .. और मुझे कोई SIG 11 नहीं मिलता है। अगर मैं आपके बाद वाले कोड को डीबग करता हूं (इनलाइन एफएनसी के साथ) gomp_loop_static_start() नहीं करता है बिल्कुल बुलाओ – sfa

+0

यदि आप ऑप्टिमाइज़ेशन सक्षम के साथ संकलित करते हैं तो आपको 'func()' केस के लिए segfault भी मिलता है। – jfs

+0

@ जेएफ। सेबेस्टियन यहां नहीं, 'func()' के साथ, यह ठीक से 390 +% CPU पर, ओ0 से -ओ 3 और -ओएस तक कुछ भी नहीं करता है। Segfaults एक unadorned 'जबकि (1);' सभी अनुकूलन स्तर पर। जीसीसी 4.5.1 है। बहुत अजीब। –

2

सुनिश्चित नहीं हैं कि अगर यह अधिक स्पष्ट संकलक संस्करण और विन्यास लेकिन while(true){} terminates

के लिए प्रासंगिक है, तो आप एक पाश जो

  • पुस्तकालय करने के लिए कोई कॉल करता है लिखने अगर मैं/हे काम करता है, और
  • अस्थिर वस्तुओं तक पहुंच या संशोधित नहीं करता है, और
  • कोई सिंक्रनाइज़ेशन ऑपरेशंस (1.10) या परमाणु संचालन (क्लॉज 2 9)
निष्पादित करता है

और समाप्त नहीं होता है, आपके पास अपरिभाषित व्यवहार है।

यह आपकी स्थिति पर लागू नहीं हो सकता है, लेकिन सी ++ 11 अधिक स्थापित हो गया है, तो देखें।

+0

अप्रासंगिक, यह सी है, और सी में, लूप को केवल समाप्त करने के लिए माना जा सकता है यदि नियंत्रण अभिव्यक्ति ** निरंतर अभिव्यक्ति ** नहीं है। चूंकि 'जबकि (1);' निरंतर अभिव्यक्ति द्वारा नियंत्रित किया जाता है, लूप को समाप्त नहीं करना चाहिए। –

+0

दिलचस्प, मुझे एहसास नहीं हुआ कि सी की निरंतर अभिव्यक्ति की गुणवत्ता नहीं थी। क्या आप मानक को इंगित कर सकते हैं, कृपया? – spraff

+0

हैलो स्पैफ, मुझे सी => में (1) में कोई अपरिभाषित व्यवहार नहीं दिख रहा है; (कृपया सी मानक को इंगित करें)। यह अपने स्वयं के पते पर एक बिना शर्त कूद (जेएमपी) कूदना चाहिए। अगर मैं 4 धागे (pthread_create के साथ) बनाता हूं और मैंने स्टार्ट फ़ंक्शन में "while (1);" मुझे कोई SIGSEGV नहीं मिलता है, और मेरे 4 कोर 100% पर हैं। मैं ओपनएमपी के साथ एक ही व्यवहार प्राप्त करना चाहता था, लेकिन ऐसा लगता है कि यह विश्वसनीय नहीं है जैसा मैंने सोचा था। – sfa

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