openmp ट्यूटोरियल
शुरुआत खुलेआम हो रही है
खोज…
टिप्पणियों
ओपनएमपी (ओपन मल्टीप्रोसेसिंग) कंपाइलर निर्देशों के आधार पर एक समानांतर प्रोग्रामिंग मॉडल है जो एप्लिकेशन डेवलपर्स को अपने एप्लिकेशन कोड में समान रूप से समानता जोड़ने की अनुमति देता है।
समानांतर प्रोग्रामिंग के लिए ओपनएमपी एपीआई विनिर्देश एक एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस (एपीआई) प्रदान करता है जो अधिकांश प्लेटफार्मों पर सी, सी ++ और फोरट्रान में बहु-मंच साझा मेमोरी मल्टीप्रोसेसिंग प्रोग्रामिंग का समर्थन करता है। इसमें संकलक निर्देशों, पुस्तकालय दिनचर्या और पर्यावरण चर का एक सेट होता है जो रन-टाइम व्यवहार को प्रभावित करता है।
चूंकि OpenMP एक नोड (साझा मेमोरी मल्टीप्रोसेसिंग) के भीतर समानता पर ध्यान केंद्रित करता है, इसे कई नोड्स पर निष्पादित करने के लिए संदेश-गुजर प्रोग्रामिंग मॉडल, जैसे कि MPI के साथ जोड़ा जा सकता है।
संस्करण
संस्करण | भाषा: हिन्दी | रिलीज़ की तारीख |
---|---|---|
4.5 | C / C ++ / फोरट्रान | 2015/11/01 |
4.0 | C / C ++ / फोरट्रान | 2013-07-01 |
3.1 | C / C ++ / फोरट्रान | 2011-07-01 |
3.0 | C / C ++ / फोरट्रान | 2008/05/01 |
2.5 | C / C ++ / फोरट्रान | 2005/05/01 |
2.0c | C / C ++ | 2002/03/01 |
2.0f | फोरट्रान | 2000/11/01 |
1.0c | C / C ++ | 1998/10/01 |
1.0f | फोरट्रान | 1997/10/01 |
संकलन
कई संकलक हैं जो ओपनएमपी विनिर्देश के विभिन्न संस्करणों का समर्थन करते हैं। OpenMP संकलक के साथ यहां एक सूची रखता है जो इसे और समर्थित संस्करण का समर्थन करता है। सामान्य तौर पर, OpenMP समर्थन के साथ एक एप्लिकेशन (और लिंक) को संकलित करने के लिए आपको केवल एक संकलन ध्वज जोड़ने की आवश्यकता होती है और यदि आप OpenMP API का उपयोग करते हैं तो आपको OpenMP शीर्षलेख (omp.h) शामिल करना होगा। जबकि हेडर फ़ाइल का एक निश्चित नाम होता है, संकलनकर्ता ध्वज संकलक पर निर्भर करता है। निम्नलिखित कंपाइलरों की गैर-विस्तृत सूची और ध्वज है जो ओपनएमपी को सक्षम करता है।
- GCC (gcc, g ++ और gfortran सहित):
-fopenmp
- LLVM: -fopenmp
- इंटेल कंपाइलर-सूट (icc, icpc और ifort सहित):
-qopenmp
(और GCC / LLVM के साथ अनुकूलता के लिए-fopenmp
) - IBM XL संकलक-सूट (xlc, xlC और xlf सहित):
-xlsmp=omp
- PGI संकलक-सूट (pgcc pgc ++ pgfortran सहित): '-mp'
OpenMP का उपयोग करके समानांतर हैलो दुनिया
#include <omp.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
#pragma omp parallel
{
printf ("Hello world! I'm thread %d out of %d threads.\n",
omp_get_thread_num(), omp_get_num_threads());
}
return 0;
}
यह कोड केवल थ्रेड्स की एक टीम बनाता है (पर्यावरण चर OMP_NUM_THREADS
अनुसार - और यदि परिभाषित नहीं किया गया है तो सिस्टम पर एक प्रति तार्किक कोर बनाएगा) और प्रत्येक थ्रेड विशिष्ट हैलो वर्ल्ड संदेश को प्रिंट करने के अलावा स्वयं की पहचान करेगा।
वर्क शेयरिंग कंस्ट्रक्शन - उदाहरण के लिए लूप
double res[MAX]; int i;
#pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
}
लूप के लिए समानांतर में निष्पादित किया जाएगा। विशाल () कुछ विधि है जिसे निष्पादित करने में बहुत लंबा समय लग सकता है। OpenMP उपरोक्त कोड को लिखने के लिए एक शॉर्टकट का समर्थन करता है:
double res[MAX]; int i;
#pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
हमारे पास एक शेड्यूल क्लॉज भी हो सकता है, जो लूप पुनरावृत्तियों को थ्रेड्स में मैप किया जाता है। उदाहरण के लिए:
#pragma omp parallel
#pragma omp for schedule(static)
for(i=0;I<N;i++) {
a[i] = a[i] + b[i];
}
समय-निर्धारण की विभिन्न शैलियाँ हैं:
अनुसूची (स्थिर [, chunk])
प्रत्येक थ्रेड को "चंक" आकार के पुनरावृत्तियों के डील-आउट ब्लॉक।
यदि निर्दिष्ट नहीं किया गया है: उपलब्ध थ्रेड्स के लिए यथासंभव समान रूप से आवंटित करें
अनुसूची (गतिशील [, हिस्सा])
जब तक सभी पुनरावृत्तियों को संभाल नहीं लिया जाता है तब तक प्रत्येक थ्रेड "चंक" पुनरावृत्तियों को पकड़ लेता है।
अनुसूची (निर्देशित [, हिस्सा])
थ्रेड्स गतिशील रूप से पुनरावृत्तियों के ब्लॉकों को पकड़ते हैं। ब्लॉक का आकार बड़ा शुरू होता है और गणना आगे बढ़ने पर आकार में "चंक" सिकुड़ जाता है।
अनुसूची (क्रम)
OMP_SCHEDULE परिवेश चर से लिया गया शेड्यूल और हिस्सा आकार।
कमी उदाहरण
#include <omp.h>
void main ()
{
int i;
double ZZ, func(), res=0.0;
#pragma omp parallel for reduction(+:res) private(ZZ)
for (i=0; i< 1000; i++){
ZZ = func(I);
res = res + ZZ;
}
}
अंतिम पंक्ति में: वास्तव में एक निजी प्रति में जोड़ा जाता है, फिर लूप के बाद जोड़ा जाता है। संकलक विवरण का ध्यान रखता है।