2010-03-07 17 views
18

मेरे पास 2 अलग-अलग कोरों पर चल रहे सी ++ कोड के दो टुकड़े हैं। वे दोनों एक ही फाइल को लिखते हैं।ओपनएमपी में लॉक का उपयोग कैसे करें?

ओपनएमपी का उपयोग कैसे करें और सुनिश्चित करें कि कोई क्रैश नहीं है?

उत्तर

35

आप OMP_SET_LOCK/OMP_UNSET_LOCK फ़ंक्शन: https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK चाहते हैं। मूल रूप से:

omp_lock_t writelock; 

omp_init_lock(&writelock); 

#pragma omp parallel for 
for (i = 0; i < x; i++) 
{ 
    // some stuff 
    omp_set_lock(&writelock); 
    // one thread at a time stuff 
    omp_unset_lock(&writelock); 
    // some stuff 
} 

omp_destroy_lock(&writelock); 

ऐसे pthreads सेमाफोर और SysV सेमाफोर के रूप में सबसे ताला दिनचर्या, तर्क की इस प्रकार की पर काम हालांकि विशिष्ट API कॉल अलग हैं।

14
#pragma omp critical 
{ 
    // write to file here 
} 
+0

एक parallelized पाश या संरचना – CharlesB

21

के बाद आने वालों के लाभ के लिए, critical का उपयोग कर वास्तव में यहाँ आसान (कोड करने और पढ़ने के लिए) है। आप यहां तक ​​कि महत्वपूर्ण वर्ग भी बना सकते हैं।

उदाहरण के लिए:

#include <omp.h> 

void myParallelFunction() 
{ 
    #pragma omp parallel for 
    for(int i=0;i<1000;++i) 
    { 

     // some expensive work 

     #pragma omp critical LogUpdate 
     { 
      // critical section where you update file   
     } 

     // other work 

     #pragma omp critical LogUpdate 
     { 
      // critical section where you update file  
     } 
    } 
} 
+6

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

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