ओपनएमपी सेक्शन को फोर्क में कैसे परिवर्तित करें ()

मैं pthreads के लिए नया हूँ और पूछना चाहूंगा कि कैसे कुछ व्यक्त करना है:

while(imhappy())
{
 #pragma omp sections
 {
  #pragma omp section
  {
   dothis();
  }
  #pragma omp section
  {
   dothat();
  }
 }
}

फोर्क() या vfork() का उपयोग कर समकक्ष निर्माण में? आगे धन्यवाद!

पीएस: मैंने कुछ संसाधन क्लोनिंग के कारण लूप में प्रवेश करने से पहले कांटा किसी भी तरह से अधिक चालाक होने पर अनुभागों के आस-पास while शामिल किया था।

0
जोड़ा संपादित
विचारों: 1

2 उत्तर

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

फिर भी, दो थ्रेड के साथ निर्मित ओपनएमपी अनुभागों का मोटा समकक्ष फोर्क होगा, बाद में if निर्माण का पालन करना होगा और मास्टर प्रक्रिया doesis() पथ निष्पादित करेगी जबकि बच्चा doesat() पथ निष्पादित करेगा। कांटा() से वापसी मूल्य माता-पिता और बाल प्रक्रियाओं में अलग है और शाखा के लिए निर्णय लेने के लिए उपयोग किया जा सकता है। तब माता-पिता की प्रक्रिया waitpid() के साथ समाप्त होने के लिए बच्चे की प्रतीक्षा करेगी जो omp सेक्शन क्षेत्र के अंत में अंतर्निहित बाधा सिंक्रनाइज़ेशन के समान होगी।

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

आप वास्तव में इसके बजाय POSIX थ्रेड API का उपयोग करना चाहते हैं।

vfork() is a syscall designed for completely different purpose and is not suitable for process cloning at all.

0
जोड़ा
तो pthreads पर विचार यह juist बन जाएगा: pthread_create (और tid1,0, doesis, 0); pthread_create (और tid2,0, dothat, 0); pthread_join (tid1,0); pthread_join (tid2,0); ? यह बहुत आसान होगा, और अगर मैं इसे सही ढंग से देखता हूं तो मैंने डिफ़ॉल्ट रूप से स्मृति साझा किया है? धन्यवाद यह बहुत आसान हो सकता है कि कांटा!
जोड़ा लेखक litro, स्रोत
pthread_create को दो बार कॉल करने की आवश्यकता नहीं है - आपके पास पहले से ही अन्य धागा है :)
जोड़ा लेखक Hristo Iliev, स्रोत

मुझे नहीं लगता कि कांटा का उपयोग करके अनुभागों का सीधा सिमुलेशन है। हालांकि, आप सैद्धांतिक रूप से एक मेगागा पासिंग तंत्र का उपयोग कर अनुकरण कर सकते हैं जहां साझा चर रूट मशीन के साथ रखा जाता है। रूट का उपयोग कर सभी ओपनएमपी फ्लश होगा। (याद रखें कि ओपनएमपी कमजोर स्थिरता मॉडल की तुलना में कमजोर उपयोग करता है)।

0
जोड़ा