मेरे पास 2 अलग-अलग कोरों पर चल रहे सी ++ कोड के दो टुकड़े हैं। वे दोनों एक ही फाइल को लिखते हैं।ओपनएमपी में लॉक का उपयोग कैसे करें?
ओपनएमपी का उपयोग कैसे करें और सुनिश्चित करें कि कोई क्रैश नहीं है?
मेरे पास 2 अलग-अलग कोरों पर चल रहे सी ++ कोड के दो टुकड़े हैं। वे दोनों एक ही फाइल को लिखते हैं।ओपनएमपी में लॉक का उपयोग कैसे करें?
ओपनएमपी का उपयोग कैसे करें और सुनिश्चित करें कि कोई क्रैश नहीं है?
आप 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 कॉल अलग हैं।
#pragma omp critical
{
// write to file here
}
के बाद आने वालों के लाभ के लिए, 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
}
}
}
क्रिटिकल ताले एक कोड खंड में केवल कोड के लिए काम करता है। यह अच्छा विचार नहीं है कि आपके पास हजारों पुनरावृत्तियों हैं और आप बस यह सुनिश्चित करना चाहते हैं कि कोई भी दो धागे एक ही पुनरावृत्ति को एक साथ निष्पादित न करें। महत्वपूर्ण साधनों का उपयोग करना कि केवल एक धागा कोई पुनरावृत्ति करता है। महत्वपूर्ण अनुभाग नामित इस समस्या को थोड़ा कम करते हैं, लेकिन ताले अधिक लचीले होते हैं क्योंकि वे डेटा तत्व को लॉक करते हैं, कोड कोड नहीं। –
एक parallelized पाश या संरचना – CharlesB