2011-11-15 9 views
7

में सिग्नल हैंडलिंग मेरे पास एक प्रोग्राम है जो POSIX टाइमर (timer_create()) का उपयोग करता है। अनिवार्य रूप से कार्यक्रम एक टाइमर सेट करता है और कुछ लंबा (संभावित अनंत) गणना करना शुरू करता है। जब टाइमर समाप्त हो जाता है और सिग्नल हैंडलर कहा जाता है, तो हैंडलर अभी तक का सबसे अच्छा परिणाम प्रिंट करता है जिसे गणना की जाती है और कार्यक्रम छोड़ती है।ओपनएमपी समांतर प्रोग्राम

मैं ओपनएमपी का उपयोग करके समांतर में गणना करने पर विचार करता हूं, क्योंकि इसे तेज करना चाहिए।

pthreads में, मेरे धागे के लिए सिग्नल मास्क सेट करने के लिए उदाहरण के लिए विशेष कार्य हैं। क्या ओपनएमपी इस तरह का नियंत्रण प्रदान करता है, या क्या मुझे इस तथ्य को स्वीकार करना है कि सिग्नल किसी भी थ्रेड को ओपनएमपी बनाता है?

इसके अलावा, अगर मैं वर्तमान में अपने कोड के समानांतर खंड में हूं और मेरे हैंडलर को बुलाया जाता है, तो क्या यह अभी भी एप्लिकेशन को सुरक्षित रूप से मार सकता है (exit(0);) और ओपनएमपी ताले लॉक करने जैसी चीजें कर सकते हैं?

+0

हो सकता है, यह एक खंड जो बाहर निकलने पकड़ता का उपयोग करके हल किया जा सकता (चित्र 1 देखें) ? – Bort

+0

ओपनएमपी विनिर्देश में "सिग्नल" शब्द नहीं है। – jfs

उत्तर

2

ओपनएमपी 3.1 मानक सिग्नल के बारे में कुछ भी नहीं कहता है।

जैसा कि मुझे पता है, लिनक्स/यूनिक्स पर हर लोकप्रिय ओपनएमपी कार्यान्वयन pthreads पर आधारित है, इसलिए ओपनएमपी थ्रेड पाथ्रेड का धागा है। और pthreads और सिग्नल के सामान्य नियम लागू होते हैं।

करता OpenMP इस तरह के नियंत्रण

नहीं किसी भी विशिष्ट नियंत्रण प्रदान करते हैं; लेकिन आप pthread के नियंत्रण का उपयोग करने की कोशिश कर सकते हैं। केवल समस्या यह जानना है कि ओपनएमपी थ्रेड का कितना उपयोग किया जाता है और कहां नियंत्रित कथन कहां रखा जाता है।

सिग्नल ओपनएमपी बनाता है किसी भी धागे को सिग्नल वितरित किया जा सकता है?

डिफ़ॉल्ट रूप से, हाँ, यह किसी भी धागे पर पहुंचा दिया जाएगा।

मेरी हैंडलर कहा जाता है,

संकेत हैंडलर के बारे में सामान्य नियम अब भी लागू होता है। सिग्नल हैंडलर में स्वीकृत कार्य http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html (पृष्ठ के अंत में)

और printf की अनुमति नहीं है (write है)। यदि आप जानते हैं कि सिग्नल प्रिंटफ के पल में किसी थ्रेड द्वारा उपयोग नहीं किया जाता है (उदाहरण के लिए आपके समांतर क्षेत्र में कोई printf नहीं है) तो आप printf का उपयोग कर सकते हैं।

यह अभी भी सुरक्षित रूप से आवेदन को मार सकता है (निकास (0);)

हाँ, यह कर सकते हैं: abort() और _exit() हैंडलर से अनुमति दी जाती है।

लिनक्स/यूनिक्स सभी धागे को समाप्त कर देगा जब कोई थ्रेड exit या abort करता है।

और ओपनएमपी ताले लॉक करने जैसी चीजें करते हैं?

आपको नहीं करना चाहिए, लेकिन अगर आपको पता है कि यह लॉक सिग्नल हैंडलर रन के समय लॉक नहीं होगा, तो आप इसे करने का प्रयास कर सकते हैं।

!! अद्यतन

ओपनएमपी http://www.cs.colostate.edu/~cs675/OpenMPvsThreads.pdf ("सी/सी ++ में थ्रेडिंग बनाम ओपनएमपी) के लिए सिग्नलिंग को अपनाने का एक उदाहरण है। संक्षेप में: हैंडलर में ध्वज सेट करें और प्रत्येक थ्रेड में प्रत्येक थ्रेड लूप पुनरावृत्ति पर इस ध्वज के चेक जोड़ें।

एक समानांतर क्षेत्र के लिए

कुछ ऐसा जो के साथ और अधिक C/C++ अनुप्रयोगों कि फोरट्रान अनुप्रयोगों के साथ कि कार्यक्रम एक परिष्कृत यूजर इंटरफेस का उपयोग करता है तब होता है एक संकेत आधारित अपवाद तंत्र अनुकूल। Genehunter एक साधारण उदाहरण है जहां उपयोगकर्ता नियंत्रण-सी दबाकर एक परिवार के पेड़ की गणना को बाधित कर सकता है ताकि यह रोग के बारे में नैदानिक ​​डेटाबेस में अगले परिवार के पेड़ पर जा सके। समयपूर्व समाप्ति को में धारावाहिक संस्करण को एक सी ++ द्वारा अपवाद सिग्नल हैंडलर, सेटजंप, और लांगजंप से युक्त तंत्र से संक्रमित संस्करण में संभाला जाता है। ओपनएमपी समानांतर निर्माण सीमा पार करने के लिए अनियंत्रित नियंत्रण प्रवाह की अनुमति नहीं देता है। हम ने मतदान तंत्र में इंटरप्ट हैंडलर को बदलकर ओपनएमपी संस्करण में अपवाद हैंडलिंग को संशोधित किया। नियंत्रण-सी सिग्नल को पकड़ने वाला थ्रेड एक साझा ध्वज सेट करता है। सभी धागे द्वारा लूप की शुरुआत में फ्लैग की जांच करें, routine has_hit_interrupt() पर कॉल करें और सेट होने पर पुनरावृत्ति को छोड़ दें। पाश समाप्त हो जाती है, गुरु ध्वज की जाँच करता है और आसानी से असाधारण बाहर निकलने के पूरा करने के लिए longjump निष्पादित कर सकते हैं जब