OpenMP
OpenMP هي واجهة برمجة تطبيقات (API) تدعم برمجة المعالجة المتعددة للذاكرة المشتركة على منصات متعددة بلغات C و C++ و Fortran ، [ 3 ] على العديد من المنصات وهياكل مجموعات التعليمات وأنظمة التشغيل ، بما في ذلك Solaris و AIX و FreeBSD و HP-UX و Linux و macOS و Windows و OpenHarmony . تتكون من مجموعة من توجيهات المُصرّف ، وروتينات المكتبة ، ومتغيرات البيئة التي تؤثر على سلوك وقت التشغيل. [ 2 ] [ 4 ] [ 5 ] [ 6 ]
تتم إدارة OpenMP بواسطة اتحاد التكنولوجيا غير الربحي OpenMP Architecture Review Board (أو OpenMP ARB )، والذي تم تحديده بشكل مشترك من قبل مجموعة واسعة من موردي أجهزة وبرامج الكمبيوتر الرائدين، بما في ذلك Arm و AMD و IBM و Intel و Cray و HP و Fujitsu و Nvidia و NEC و Red Hat و Texas Instruments و Oracle Corporation . [ 1 ]
يستخدم OpenMP نموذجًا محمولًا وقابلًا للتطوير يوفر للمبرمجين واجهة بسيطة ومرنة لتطوير تطبيقات متوازية لمنصات تتراوح من أجهزة الكمبيوتر المكتبية القياسية إلى أجهزة الكمبيوتر العملاقة .
يمكن تشغيل تطبيق مبنيّ باستخدام النموذج الهجين للبرمجة المتوازية على مجموعة حاسوبية باستخدام كلٍّ من OpenMP وواجهة تمرير الرسائل (MPI)، حيث يُستخدم OpenMP للتوازي داخل عقدة (متعددة النوى) بينما يُستخدم MPI للتوازي بين العقد. وقد بُذلت جهودٌ أيضًا لتشغيل OpenMP على أنظمة الذاكرة المشتركة الموزعة برمجياً ، [ 7 ] ولترجمة OpenMP إلى MPI [ 8 ] [ 9 ] ولتوسيع OpenMP ليشمل أنظمة الذاكرة غير المشتركة. [ 10 ]
تصميم

OpenMP هو تطبيق لتقنية تعدد الخيوط ، وهي طريقة للتوازي حيث يقوم خيط رئيسي (سلسلة من التعليمات تُنفذ بالتتابع) بإنشاء عدد محدد من الخيوط الفرعية ، ويقوم النظام بتقسيم المهمة بينها. ثم تعمل الخيوط بشكل متزامن ، حيث يقوم بيئة التشغيل بتخصيص الخيوط للمعالجات المختلفة.
يُحدد قسم الكود المُصمم للتنفيذ المتوازي وفقًا لذلك، باستخدام توجيه للمُترجم يُؤدي إلى تكوين الخيوط قبل تنفيذ هذا القسم. [ 3 ] لكل خيط مُعرّف خاص به يُمكن الحصول عليه باستخدام دالة (تُسمى omp_get_thread_num()). مُعرّف الخيط هو عدد صحيح، ومُعرّف الخيط الرئيسي هو 0. بعد تنفيذ الكود المُوازي، تعود الخيوط إلى الخيط الرئيسي، الذي يستمر في العمل حتى نهاية البرنامج.
افتراضيًا، يُنفّذ كل خيط الجزء المتوازي من التعليمات البرمجية بشكل مستقل. يمكن استخدام آليات تقاسم العمل لتقسيم المهمة بين الخيوط بحيث يُنفّذ كل خيط الجزء المخصص له من التعليمات البرمجية. بهذه الطريقة، يُمكن تحقيق كل من التوازي في المهام والتوازي في البيانات باستخدام OpenMP.
تُخصّص بيئة التشغيل الخيوط للمعالجات بناءً على الاستخدام وحمل الجهاز وعوامل أخرى. يمكن لبيئة التشغيل تحديد عدد الخيوط بناءً على متغيرات البيئة ، أو يمكن للبرنامج القيام بذلك باستخدام الدوال. تُضمّن دوال OpenMP في ملف رأس يُسمى omp.h في لغتي C و C++ .
تاريخ
نشر مجلس مراجعة بنية OpenMP (ARB) أول مواصفات واجهة برمجة التطبيقات (API) الخاصة به، OpenMP للغة Fortran 1.0، في أكتوبر 1997. وفي أكتوبر من العام التالي، أصدر المجلس معيار C/C++. وشهد عام 2000 إصدار النسخة 2.0 من مواصفات Fortran، بينما صدرت النسخة 2.0 من مواصفات C/C++ في عام 2002. أما النسخة 2.5 فهي مواصفات مُدمجة للغات C/C++ وFortran، وقد صدرت في عام 2005.
Up to version 2.0, OpenMP primarily specified ways to parallelize highly regular loops, as they occur in matrix-oriented numerical programming, where the number of iterations of the loop is known at entry time. This was recognized as a limitation, and various task parallel extensions were added to implementations. In 2005, an effort to standardize task parallelism was formed, which published a proposal in 2007, taking inspiration from task parallelism features in Cilk, X10 and Chapel.[11]
Version 3.0 was released in May 2008. Included in the new features in 3.0 is the concept of tasks and the task construct,[12] significantly broadening the scope of OpenMP beyond the parallel loop constructs that made up most of OpenMP 2.0.[13] OpenMP 3.1 was released in September 2011, enhancing tasking with features like task finalization (final clause) and task dependencies (depend clause). It also improved support for Fortran 2003 and added atomic construct enhancements.
Version 4.0 of the specification was released in July 2013.[14] It adds or improves the following features: support for accelerators; atomics; error handling; thread affinity; tasking extensions; user defined reduction; SIMD support; Fortran 2003 support.[15] OpenMP 4.0 (2013) also introduced support for accelerators (e.g., GPUs) via the target directive, enabling offloading computations to devices like GPUs or FPGAs. It also added SIMD (Single Instruction, Multiple Data) directives for vectorization and user-defined reductions. Version 4.5 (2015) enhanced device support, improved tasking with dependencies, and introduced loop transformations for better optimization.
Version 5.0 (2018) added significant features like memory management for accelerators, support for deep copy in target directives, and loop transformation constructs. It also improved interoperability with other programming models like MPI. OpenMP 5.1 (2020) focused on usability, adding features like loop fusion, improved task reduction, and better support for C++11/14/17 constructs. Version 5.2 (2021) refined existing features, improved compatibility with modern hardware, and added support for descriptive loop directives..[16]
تم إصدار الإصدار 6.0 في نوفمبر 2024. [ 17 ] يركز هذا الإصدار على تحسين OpenMP للحوسبة غير المتجانسة، والتكامل مع أحمال عمل الذكاء الاصطناعي/التعلم الآلي، وتحسين قابلية نقل الأداء عبر البنى المتنوعة.
لاحظ أن بعض المترجمات (وأنظمة التشغيل) لا تدعم المجموعة الكاملة من الميزات لأحدث إصدار/إصدارات.
العناصر الأساسية

العناصر الأساسية لـ OpenMP هي هياكل إنشاء الخيوط، وتوزيع عبء العمل (مشاركة العمل)، وإدارة بيئة البيانات، ومزامنة الخيوط، وروتينات وقت التشغيل على مستوى المستخدم، ومتغيرات البيئة.
في لغة C/C++، يستخدم OpenMP التوجيهات البرمجية #pragma s . فيما يلي قائمة بالتوجيهات البرمجية الخاصة بـ OpenMP.
إنشاء موضوع
يُستخدم الأمر البرمجي omp parallelلإنشاء سلاسل عمليات إضافية لتنفيذ العمل المضمن في البنية بالتوازي. سيتم الإشارة إلى سلسلة العمليات الأصلية master threadبرقم تعريف السلسلة 0.
مثال (برنامج بلغة C): عرض "Hello, world." باستخدام خيوط متعددة.
#include <stdio.h> #include <omp.h>int main ( void ) { #pragma omp parallel printf ( "Hello, world. \n " ); return 0 ; }استخدم الخيار -fopenmp للتجميع باستخدام GCC:
$ gcc -fopenmp hello.c -o hello -ldl الناتج على جهاز كمبيوتر ثنائي النواة، وبالتالي ثنائي الخيوط:
مرحبا بالعالم. مرحبا بالعالم. ومع ذلك، قد يكون الإخراج مشوشًا أيضًا بسبب حالة التزامن الناتجة عن مشاركة الخيطين للإخراج القياسي .
مرحباً، مرحباً أيها العالم. rld. يعتمد كون printfالعملية ذرية على التنفيذ الأساسي [ 18 ] على عكس C++11 std::cout، الذي يكون آمنًا للاستخدام في بيئات متعددة الخيوط بشكل افتراضي. [ 19 ]
هياكل تقاسم العمل
يُستخدم لتحديد كيفية إسناد العمل المستقل إلى واحد أو جميع الخيوط.
omp forأوomp do: تُستخدم لتقسيم تكرارات الحلقة بين الخيوط، وتسمى أيضًا بنيات الحلقة.sections: تخصيص كتل برمجية متتالية ولكن مستقلة لخيوط مختلفةsingleعند تحديد كتلة برمجية يتم تنفيذها بواسطة خيط واحد فقط، يتم تضمين حاجز في النهاية.master: مشابه للوضع الفردي، ولكن سيتم تنفيذ كتلة التعليمات البرمجية بواسطة الخيط الرئيسي فقط ولن يكون هناك حاجز ضمني في النهاية.
مثال: تهيئة قيمة مصفوفة كبيرة بالتوازي، باستخدام كل خيط لتنفيذ جزء من العمل
// تعريف N كقيمة ثابتة لطول المصفوفة #define N 100000int main ( int argc , char * argv []) { int a [ N ];#pragma omp parallel for for ( int i = 0 ; i < N ; i ++ ) { a [ i ] = 2 * i ; }return 0 ; }هذا المثال متوازي بشكل محرج ، ويعتمد فقط على قيمة المتغير i. parallel forتُخبر علامة OpenMP نظام OpenMP بتقسيم هذه المهمة بين خيوط العمل. سيحصل كل خيط على نسخة فريدة وخاصة من المتغير. [ 20 ] على سبيل المثال، مع خيطي عمل، قد يحصل أحدهما على نسخة من iالمتغير تتراوح قيمتها من 0 إلى 49999، بينما يحصل الآخر على نسخة تتراوح قيمتها من 50000 إلى 99999.
توجيهات المتغيرات
تُعدّ توجيهات المتغيرات إحدى الميزات الرئيسية التي أُضيفت في مواصفات OpenMP 5.0 لتسهيل تحسين قابلية نقل الأداء للمبرمجين. فهي تُمكّن من تكييف تعليمات OpenMP البرمجية ورمز المستخدم أثناء الترجمة. تُعرّف المواصفات سمات لوصف بنيات OpenMP النشطة، وأجهزة التنفيذ، والوظائف التي يوفرها التطبيق، ومحددات السياق بناءً على السمات والشروط التي يُحددها المستخدم، وتوجيهات تُمكّن metadirectiveالمستخدمين declare directiveمن برمجة نفس منطقة الكود باستخدام توجيهات المتغيرات.
- هذا
metadirectiveتوجيه قابل للتنفيذ يتم حله بشكل مشروط إلى توجيه آخر في وقت الترجمة عن طريق الاختيار من بين متغيرات توجيه متعددة بناءً على السمات التي تحدد شرط أو سياق OpenMP. - يتمتع التوجيه
declare variantبوظائف مماثلةmetadirectiveولكنه يختار متغير الوظيفة في موقع الاستدعاء بناءً على السياق أو الشروط التي يحددها المستخدم.
إن الآلية التي توفرها توجيهات المتغيرات لاختيار المتغيرات أكثر ملاءمة للاستخدام من المعالجة المسبقة C/C++ لأنها تدعم بشكل مباشر اختيار المتغيرات في OpenMP وتسمح لمترجم OpenMP بتحليل وتحديد التوجيه النهائي من المتغيرات والسياق.
// تعريف حجم المصفوفة كقيمة ثابتة لطولها: #define N 100000 // تعديل الكود باستخدام توجيهات المعالجة المسبقةint v1 [ N ]; int v2 [ N ]; int v3 [ N ]; #if defined(nvptx) #pragma omp target teams distribute parallel for map(to:v1,v2) map(from:v3) for ( int i = 0 ; i < N ; ++ i ) { v3 [ i ] = v1 [ i ] * v2 [ i ]; } #else #pragma omp target parallel for map(to:v1,v2) map(from:v3) for ( int i = 0 ; i < N ; ++ i ) { v3 [ i ] = v1 [ i ] * v2 [ i ]; } #endif// تعديل الكود باستخدام التوجيه الوصفي في OpenMP 5.0int v1 [ N ]; int v2 [ N ]; int v3 [ N ]; #pragma omp target map(to:v1,v2) map(from:v3) #pragma omp metadirective \ when(device={arch(nvptx)}: target teams distribute parallel for) \ default(target parallel for) for ( int i = 0 ; i < N ; ++ i ) { v3 [ i ] = v1 [ i ] * v2 [ i ]; }البنود
بما أن OpenMP نموذج برمجة يعتمد على الذاكرة المشتركة، فإن معظم المتغيرات في كود OpenMP تكون مرئية لجميع الخيوط افتراضيًا. ولكن في بعض الأحيان، تكون المتغيرات الخاصة ضرورية لتجنب حالات التزامن ، وهناك حاجة لتمرير القيم بين الجزء التسلسلي والمنطقة المتوازية (كتلة الكود التي تُنفذ بالتوازي)، لذا تُقدم إدارة بيئة البيانات من خلال بنود سمات مشاركة البيانات بإلحاقها بتوجيه OpenMP. أنواع هذه البنود هي:
بنود سمات مشاركة البيانات
sharedتُشارك البيانات المُعلنة خارج منطقة التوازي، ما يعني أنها مرئية ويمكن الوصول إليها من جميع الخيوط في آنٍ واحد. افتراضيًا، تُشارك جميع المتغيرات في منطقة مشاركة العمل باستثناء عداد تكرار الحلقة.privateالبيانات المُعلنة داخل منطقة متوازية خاصة بكل خيط، ما يعني أن كل خيط سيحتفظ بنسخة محلية منها ويستخدمها كمتغير مؤقت. لا يتم تهيئة المتغير الخاص، ولا تُحفظ قيمته لاستخدامها خارج المنطقة المتوازية. افتراضيًا، تكون عدادات تكرار الحلقة في بنى حلقات OpenMP خاصة.defaultيُتيح هذا الخيار للمبرمج تحديد نطاق البيانات الافتراضي داخل منطقة متوازيةshared، إما `<data->` أو `<data->`noneفي لغتي C/C++، أوshared`<data->firstprivate` أو `<data->private` أو `none<data->` في لغة Fortran.noneويُلزم هذا الخيار المبرمج بتعريف كل متغير في المنطقة المتوازية باستخدام عبارات سمة مشاركة البيانات.firstprivate: البيانات خاصة بكل سلسلة عمليات، ولكن يتم تهيئتها باستخدام قيمة المتغير الذي يحمل نفس الاسم من سلسلة العمليات الرئيسية.lastprivateالبيانات خاصة بكل خيط. سيتم نسخ قيمة هذه البيانات الخاصة إلى متغير عام يحمل نفس الاسم خارج المنطقة المتوازية إذا كانت الدورة الحالية هي الدورة الأخيرة في الحلقة المتوازية. يمكن أن يكون المتغير خاصًاfirstprivateوغير خاصlastprivate.threadprivateالبيانات بيانات عامة، لكنها خاصة في كل منطقة متوازية أثناء وقت التشغيل. الفرق بينهماthreadprivateهوprivateالنطاق العام المرتبط بكلthreadprivateبيانات والقيمة المحفوظة عبر المناطق المتوازية.
بنود التزامن
criticalسيتم تنفيذ كتلة التعليمات البرمجية المرفقة بواسطة خيط واحد فقط في كل مرة، ولن يتم تنفيذها في وقت واحد بواسطة خيوط متعددة. ويُستخدم هذا الأسلوب غالبًا لحماية البيانات المشتركة من حالات التزامن .atomicسيتم تنفيذ تحديث الذاكرة (كتابة، أو قراءة-تعديل-كتابة) في التعليمة التالية بشكل ذري. هذا لا يجعل العبارة بأكملها ذرية؛ بل تحديث الذاكرة فقط هو الذري. قد يستخدم المترجم تعليمات خاصة بالأجهزة لتحسين الأداء مقارنةً باستخدامcritical.orderedيتم تنفيذ الكتلة المهيكلة بالترتيب الذي يتم به تنفيذ التكرارات في حلقة متسلسلةbarrierينتظر كل خيط حتى تصل جميع الخيوط الأخرى في الفريق إلى هذه النقطة. يتضمن هيكل مشاركة العمل مزامنة حاجز ضمنية في النهاية.nowaitيُحدد هذا الشرط أن الخيوط التي تُكمل العمل المُسند إليها يُمكنها المُتابعة دون انتظار انتهاء جميع الخيوط في الفريق. في حال عدم وجود هذا الشرط، ستواجه الخيوط حاجز تزامن في نهاية عملية مُشاركة العمل.
بنود الجدولة
schedule (type, chunk)يُعدّ هذا مفيدًا إذا كانت بنية مشاركة العمل عبارة عن حلقة تكرارية (do-loop) أو حلقة تكرارية (for-loop). تُوزّع التكرارات في بنية مشاركة العمل على الخيوط وفقًا لطريقة الجدولة المُحدّدة في هذه العبارة. أنواع الجدولة الثلاثة هي:staticهنا، تُخصَّص لكل خيط عدد من التكرارات قبل تنفيذ حلقات التكرار. تُقسَّم التكرارات بين الخيوط بالتساوي افتراضيًا. مع ذلك، سيؤدي تحديد عدد صحيح للمعاملchunkإلى تخصيص عدد محدد من التكرارات المتجاورة لخيط معين.dynamicهنا، تُخصص بعض التكرارات لعدد أقل من الخيوط. بمجرد أن يُنهي خيطٌ ما تكراره المُخصص له، يعود ليحصل على تكرار آخر من التكرارات المتبقية.chunkيُحدد هذا المعامل عدد التكرارات المتتالية التي تُخصص لخيطٍ ما في كل مرة.guidedيتم تخصيص جزء كبير من التكرارات المتجاورة لكل خيط بشكل ديناميكي (كما هو موضح أعلاه). يتناقص حجم الجزء بشكل أُسّي مع كل تخصيص لاحق حتى يصل إلى الحد الأدنى المحدد في المعامل.chunk
التحكم في التردد المتوسط
ifسيؤدي هذا إلى قيام الخيوط بتنفيذ المهمة بالتوازي فقط في حالة تحقق شرط معين. وإلا، فسيتم تنفيذ كتلة التعليمات البرمجية بالتسلسل.
نسخ البيانات
copyinعلى غرارfirstprivateالمتغيراتprivate،threadprivateلا يتم تهيئة المتغيرات، إلا عند استخدامهاcopyinلتمرير القيمة من المتغيرات العامة المقابلة. لاcopyoutحاجة لذلك لأن قيمة المتغيرthreadprivateتبقى محفوظة طوال مدة تنفيذ البرنامج.copyprivate: يستخدمsingleلدعم نسخ قيم البيانات من الكائنات الخاصة على مؤشر ترابط واحد (singleمؤشر الترابط) إلى الكائنات المقابلة على مؤشرات الترابط الأخرى في الفريق.
تخفيض
reduction (operator | intrinsic : list)يحتوي المتغير على نسخة محلية في كل خيط، ولكن يتم تجميع قيم النسخ المحلية في متغير مشترك عام. يُعد هذا مفيدًا جدًا إذا كانت عملية معينة (محددة فيoperatorهذه الفقرة) على متغير ما تُنفذ بشكل تكراري، بحيث تعتمد قيمته في تكرار معين على قيمته في تكرار سابق. تُنفذ الخطوات التي تؤدي إلى الزيادة التشغيلية بالتوازي، ولكن الخيوط تُحدّث المتغير العام بطريقة آمنة للخيوط. يُعد هذا ضروريًا في موازاة التكامل العددي للدوال والمعادلات التفاضلية ، على سبيل المثال.
آحرون
flushيتم استعادة قيمة هذا المتغير من المسجل إلى الذاكرة لاستخدام هذه القيمة خارج جزء متوازٍ.masterيتم تنفيذ هذا الأمر فقط بواسطة الخيط الرئيسي (الخيط الذي أنشأ جميع الخيوط الأخرى أثناء تنفيذ توجيه OpenMP). لا يوجد حاجز ضمني؛ ولا يُشترط وصول أعضاء الفريق الآخرين (الخيوط) إليه.
إجراءات وقت التشغيل على مستوى المستخدم
تُستخدم لتعديل/التحقق من عدد الخيوط، والكشف عما إذا كان سياق التنفيذ في منطقة متوازية، وعدد المعالجات في النظام الحالي، وتعيين/إلغاء الأقفال، ووظائف التوقيت، وما إلى ذلك
متغيرات البيئة
طريقة لتعديل خصائص تنفيذ تطبيقات OpenMP. تُستخدم للتحكم في جدولة تكرارات الحلقات، والعدد الافتراضي للخيوط، وما إلى ذلك. على سبيل المثال، OMP_NUM_THREADSتُستخدم لتحديد عدد الخيوط لتطبيق ما.
التطبيقات
تم تطبيق OpenMP في العديد من المترجمات التجارية. على سبيل المثال، يدعم Visual C++ إصدارات 2005 و2008 و2010 و2012 و2013 (OpenMP 2.0، في إصدارات Professional وTeam System وPremium وUltimate [ 21 ] [ 22 ] [ 23 ] )، بالإضافة إلى Intel Parallel Studio لمختلف المعالجات. [ 24 ] تدعم مترجمات وأدوات Oracle Solaris Studio أحدث مواصفات OpenMP مع تحسينات في الإنتاجية لأنظمة Solaris OS (UltraSPARC وx86/x64) ومنصات Linux. كما تدعم مترجمات Fortran وC وC++ من مجموعة Portland Group معيار OpenMP 2.5. ويدعم GCC أيضًا OpenMP منذ الإصدار 4.2.
المترجمات التي تتضمن تطبيقًا لـ OpenMP 3.0:
- GCC 4.3.1
- مُجمِّع ميركوريوم
- Intel Fortran و C/C++ الإصدارات 11.0 و 11.1 من المترجمات، Intel C/C++ و Fortran Composer XE 2011 و Intel Parallel Studio.
- مُترجم IBM XL [ 25 ]
- يحتوي تحديث Sun Studio 12 1 على تطبيق كامل لـ OpenMP 3.0 [ 26 ]
- الحوسبة متعددة المعالجات
تدعم العديد من المترجمات OpenMP 3.1:
- GCC 4.7 [ 27 ]
- مترجمات Intel Fortran و C/C++ 12.1 [ 28 ]
- مترجمات IBM XL C/C++ لأنظمة AIX و Linux، الإصدار 13.1 [ 29 ] ومترجمات IBM XL Fortran لأنظمة AIX و Linux، الإصدار 14.1 [ 30 ]
- LLVM/Clang 3.7 [ 31 ]
- Absoft Fortran Compilers v. 19 لأنظمة التشغيل Windows و Mac OS X و Linux [ 32 ]
المترجمات التي تدعم OpenMP 4.0:
- GCC 4.9.0 للغة C/C++، وGCC 4.9.1 للغة Fortran [ 27 ] [ 33 ]
- مترجمات Intel Fortran و C/C++ 15.0 [ 34 ]
- IBM XL C/C++ لنظام Linux، الإصدار 13.1 (جزئي) [ 29 ] و XL Fortran لنظام Linux، الإصدار 15.1 (جزئي) [ 30 ]
- LLVM/Clang 3.7 (جزئي) [ 31 ]
العديد من المترجمات البرمجية التي تدعم OpenMP 4.5:
دعم جزئي لـ OpenMP 5.0:
مُجمّعات برمجية ذاتية التوازي تُولّد شفرة مصدرية مُعلّقة بتوجيهات OpenMP:
- iPat/OMP
- برامج متوازية
- بلوتو
- ROSE (إطار عمل المترجم)
- S2P بواسطة KPIT Cummins Infosystems Ltd.
- مقارنة
- براغفورمر
تدعم العديد من أدوات تحليل الأداء وتصحيح الأخطاء OpenMP بشكل صريح:
- برنامج Intel VTune Profiler - برنامج لتحليل أداء معالجات x86 ووحدات معالجة الرسومات X e
- إنتل أدفايزر - أداة مساعدة في التصميم وتحليل أكواد OpenMP وMPI
- أداة تصحيح الأخطاء الموزعة من ألينيا (DDT) – مصحح أخطاء لبرامج OpenMP وMPI
- Allinea MAP – أداة تحليل الأداء لبرامج OpenMP و MPI
- TotalView - مصحح أخطاء من شركة Rogue Wave Software لبرامج OpenMP وMPI والبرامج التسلسلية
- ompP – أداة تحليل الأداء لـ OpenMP
- VAMPIR – أداة تحليل أداء أكواد OpenMP و MPI
الإيجابيات والسلبيات
الإيجابيات:
- كود متعدد الخيوط قابل للنقل (في لغات C/C++ وغيرها، عادةً ما يتعين على المرء استدعاء البدائيات الخاصة بالمنصة للحصول على تعدد الخيوط).
- ببساطة: لا حاجة للتعامل مع تمرير الرسائل كما تفعل MPI .
- تتم معالجة تخطيط البيانات وتفكيكها تلقائيًا بواسطة التوجيهات.
- قابلية التوسع مماثلة لـ MPI على أنظمة الذاكرة المشتركة. [ 40 ]
- التوازي التدريجي: يمكن العمل على جزء واحد من البرنامج في كل مرة، ولا حاجة إلى تغيير جذري في الكود.
- رمز موحد لكل من التطبيقات التسلسلية والمتوازية: يتم التعامل مع بنيات OpenMP كتعليقات عند استخدام المترجمات التسلسلية.
- لا يلزم تعديل عبارات التعليمات البرمجية الأصلية (التسلسلية) بشكل عام عند تنفيذها بالتوازي باستخدام OpenMP. وهذا يقلل من احتمالية إدخال أخطاء غير مقصودة.
- التوازي الخشن والتوازي الدقيق ممكنان.
- في التطبيقات متعددة الفيزياء غير المنتظمة التي لا تلتزم فقط بنمط حساب SPMD ، كما هو الحال في أنظمة السوائل والجسيمات المترابطة بإحكام، يمكن أن تتمتع مرونة OpenMP بميزة أداء كبيرة مقارنة بـ MPI . [ 40 ] [ 41 ]
- يمكن استخدامه على مسرعات مختلفة مثل GPGPU [ 42 ] و FPGAs .
السلبيات:
- خطر إدخال أخطاء تزامن يصعب تصحيحها وحالات تنافس . [ 43 ] [ 44 ]
- اعتبارًا من عام 2017يعمل بكفاءة فقط في منصات المعالجات المتعددة ذات الذاكرة المشتركة (انظر مع ذلك Intel's Cluster OpenMP Archived 2018-11-16 at the Wayback Machine ومنصات الذاكرة المشتركة الموزعة الأخرى ).
- يتطلب ذلك مُترجمًا يدعم OpenMP.
- تُحدّ بنية الذاكرة من إمكانية التوسع.
- لا يوجد دعم للمقارنة والتبديل . [ 45 ]
- يفتقر النظام إلى معالجة موثوقة للأخطاء.
- يفتقر إلى آليات دقيقة للتحكم في تعيين سلاسل العمليات والمعالجات.
- احتمالية كبيرة لكتابة كود مشاركة خاطئ عن طريق الخطأ.
توقعات الأداء
قد يتوقع المرء الحصول على تسريع بمقدار N مرة عند تشغيل برنامج مُوازٍ باستخدام OpenMP على منصة ذات N معالج. ومع ذلك، نادرًا ما يحدث هذا للأسباب التالية:
- عندما توجد تبعية، يجب على العملية أن تنتظر حتى يتم حساب البيانات التي تعتمد عليها.
- عندما تتشارك عدة عمليات في مورد غير متوازي (مثل ملف للكتابة فيه)، تُنفذ طلباتها بالتتابع. لذلك، يجب على كل عملية انتظار حتى تُحرر العملية الأخرى المورد.
- قد لا يتم تنفيذ جزء كبير من البرنامج بالتوازي بواسطة OpenMP، مما يعني أن الحد الأعلى النظري للتسريع محدود وفقًا لقانون أمدال .
- قد تمتلك N معالجات في نظام المعالجة المتعددة المتناظرة (SMP) قوة حسابية تفوق N ضعفًا، لكن عرض نطاق الذاكرة عادةً لا يتضاعف N ضعفًا. في كثير من الأحيان، يتشارك عدة معالجات مسار الذاكرة الأصلي، وقد يُلاحظ تدهور في الأداء عند تنافسها على عرض نطاق الذاكرة المشترك.
- العديد من المشاكل الشائعة الأخرى التي تؤثر على التسريع النهائي في الحوسبة المتوازية تنطبق أيضًا على OpenMP، مثل موازنة الأحمال وتكاليف المزامنة.
- قد لا يكون تحسين المُصرّف فعالاً بالقدر الكافي عند استدعاء OpenMP. وهذا قد يؤدي عادةً إلى تشغيل برنامج OpenMP أحادي الخيوط بشكل أبطأ من نفس الكود المُصرّف بدون علامة OpenMP (والذي سيكون تسلسليًا بالكامل).
تقارب الخيوط
يوصي بعض الموردين بتحديد تقارب المعالج في سلاسل OpenMP لربطها بنوى معالج محددة. [ 46 ] [ 47 ] [ 48 ] يقلل هذا من تكلفة ترحيل السلاسل وتبديل السياق بين النوى. كما أنه يحسن موضع البيانات ويقلل من حركة مرور اتساق ذاكرة التخزين المؤقت بين النوى (أو المعالجات).
المعايير
تم تطوير مجموعة متنوعة من المعايير لتوضيح استخدام OpenMP، واختبار أدائه وتقييم صحته.
أمثلة بسيطة
- OmpSCR: مستودع شفرة المصدر لـ OpenMP
تشمل معايير الأداء ما يلي:
- اختبار الأداء المتوازي لـ NAS
- مجموعة مهام برشلونة OpenMP هي مجموعة من التطبيقات التي تسمح باختبار تطبيقات مهام OpenMP.
- سلسلة SPEC
- مواصفات OMP 2012
- مجموعة اختبارات SPEC ACCEL المعيارية لاختبار واجهة برمجة تطبيقات تفريغ الهدف OpenMP 4
- معيار SPEChpc 2002
- معايير كورال
- تطبيقات الوكيل على نطاق إكساسكيل
- شركة رودينيا تركز على المسرعات.
- مجموعة معايير الأداء القائمة على حل المشكلات
تشمل معايير الدقة ما يلي:
- مجموعة التحقق من صحة OpenMP
- مجموعة اختبارات التحقق من صحة OpenMP
- DataRaceBench عبارة عن مجموعة أدوات قياس مصممة لتقييم فعالية أدوات الكشف عن تضارب البيانات في OpenMP بشكل منهجي وكمي.
- AutoParBench عبارة عن مجموعة أدوات قياس الأداء لتقييم المترجمات والأدوات التي يمكنها إدراج توجيهات OpenMP تلقائيًا.
انظر أيضاً
مراجع
- ١ ٢ ٣ "حول OpenMP ARB و" . OpenMP.org. ١١ يوليو ٢٠١٣. مؤرشف من الأصل في ٩ أغسطس ٢٠١٣. تم الاطلاع عليه في ١٤ أغسطس ٢٠١٣ .
- 1 2 "مترجمات وأدوات OpenMP" . OpenMP.org. نوفمبر 2019. تم الاسترجاع في 5 مارس 2020 .
- 1 2 سيلبرشاتز، أبراهام؛ جالفين، بيتر باير؛ غاني، جريج (17-12-2012). مفاهيم أنظمة التشغيل ( الطبعة التاسعة). هوبوكين، نيوجيرسي: وايلي. الصفحات 181-182 . ISBN 978-1-118-06333-0.
- ↑ برنامج OpenMP التعليمي في Supercomputing 2008
- ↑ استخدام OpenMP - البرمجة المتوازية المحمولة للذاكرة المشتركة - تنزيل أمثلة الكتاب ومناقشتها
- ^ "أوبن أتوم أوبن هارموني" . docs.openharmony.cn . تم الاسترجاع 2025-03-02 .
- ↑ كوستا، جيه جيه، وآخرون (مايو 2006). "تشغيل تطبيقات OpenMP بكفاءة على نظام SDSM مشترك بالكامل". مجلة الحوسبة المتوازية والموزعة . 66 (5): 647-658 . doi : 10.1016/j.jpdc.2005.06.018 . hdl : 2117/370260 .
- ↑ باسومليك، أيون؛ مين، سيونغ جاي؛ إيجنمان، رودولف (2007). “برمجة أنظمة الذاكرة الموزعة باستخدام OpenMP”. 2007 ندوة IEEE الدولية للمعالجة المتوازية والموزعة . نيويورك: مطبعة IEEE. ص 1 – 8. CiteSeerX 10.1.1.421.8570 . دوى : 10.1109/IPDPS.2007.370397 . رقم ISBN 978-1-4244-0909-9. S2CID 14237507 . تتوفر نسخة أولية على الصفحة الرئيسية لـ Chen Ding ؛ انظر بشكل خاص القسم 3 حول ترجمة OpenMP إلى MPI.
- ↑ وانغ، جو؛ هو، تشانغ جون؛ تشانغ، جيلين؛ لي، جيان جيانغ (مايو 2010). "مترجم OpenMP لبنى الذاكرة الموزعة" . مجلة ساينس تشاينا لعلوم المعلومات . 53 (5): 932-944 . doi : 10.1007/s11432-010-0074-0 .( اعتبارًا من عام 2016)يبدو أن برنامج KLCoMP الموصوف في هذه الورقة غير متاح للجمهور.
- ↑ Cluster OpenMP (منتج كان متاحًا سابقًا لإصدارات Intel C++ Compiler من 9.1 إلى 11.1 ولكن تم إسقاطه في الإصدار 13.0)
- ↑ أيغواد، إدوارد؛ كوبتي، نوال؛ دوران، أليخاندرو؛ هوفلينغر، جاي؛ لين، يوان؛ ماسايولي، فيديريكو؛ سو، إرنستو؛ أونيكريشنان، بريا؛ تشانغ، غوانسونغ (2007). اقتراح لتوازي المهام في OpenMP (ملف PDF) . وقائع ورشة العمل الدولية حول OpenMP.
- ↑ "واجهة برمجة تطبيقات OpenMP، الإصدار 3.0" (ملف PDF) . openmp.org. مايو 2008. تاريخ الاسترجاع: 6 فبراير 2014 .
- ↑ لاغرون، جيمس؛ أريبوكي، أيودوني؛ أديسون، كودي؛ تشابمان، باربرا (2011). تطبيق وقت التشغيل لمهام OpenMP . وقائع ورشة العمل الدولية حول OpenMP. الصفحات 165-178 . CiteSeerX 10.1.1.221.2775 . doi : 10.1007/978-3-642-21487-5_13 .
- ↑ "إصدار واجهة برمجة تطبيقات OpenMP 4.0" . OpenMP.org. 26 يوليو 2013. مؤرشف من الأصل بتاريخ 9 نوفمبر 2013. تم الاطلاع عليه بتاريخ 14 أغسطس 2013 .
- ↑ "واجهة برمجة تطبيقات OpenMP، الإصدار 4.0" (ملف PDF) . openmp.org. يوليو 2013. تاريخ الاسترجاع: 6 فبراير 2014 .
- ↑ "مواصفات OpenMP 5.2" .
- ↑ "OpenMP ARB تُصدر OpenMP 6.0 لتسهيل البرمجة" . 14 نوفمبر 2024.
- ↑ "ج - كيفية استخدام printf() في عدة سلاسل عمليات" .
- ↑ "std::cout, std::wcout - cppreference.com" .
- ↑ "درس تعليمي - حلقات for المتوازية مع OpenMP" . 2009-07-14.
- ↑ إصدارات Visual C++، Visual Studio 2005
- ↑ إصدارات Visual C++، Visual Studio 2008
- ↑ إصدارات Visual C++، Visual Studio 2010
- ↑ ديفيد وورثينجتون، "إنتل تعالج دورة حياة التطوير باستخدام Parallel Studio" مؤرشف في 2012-02-15 في Wayback Machine ، SDTimes، 26 مايو 2009 (تم الوصول إليه في 28 مايو 2009)
- ↑ "ميزات XL C/C++ لنظام Linux" ، (تم الاطلاع عليه في 9 يونيو 2009)
- ↑ "شبكة أوراكل التقنية لمطوري جافا | شبكة أوراكل التقنية | أوراكل" . Developers.sun.com . تم الاطلاع عليه بتاريخ 14 أغسطس 2013 .
- 1 2 "openmp – GCC Wiki" . Gcc.gnu.org. 2013-07-30 . تم الاطلاع عليه بتاريخ 2013-08-14 .
- ↑ كينيدي، باتريك (2011-09-06). "مترجمات Intel® C++ وFortran تدعم الآن مواصفات OpenMP* 3.1 | منطقة مطوري Intel®" . Software.intel.com . تم الاطلاع عليه بتاريخ 2013-08-14 .
- 1 2 "ميزات مُجمِّعات IBM XL C/C++" . IBM . 13 ديسمبر 2018.
- 1 2 "ميزات مترجمات IBM XL Fortran" . 13 ديسمبر 2018.
- 1 2 "ملاحظات إصدار Clang 3.7" . llvm.org . تم الاطلاع عليه بتاريخ 10-10-2015 .
- ↑ "الصفحة الرئيسية لشركة أبسوفت" . مؤرشفة من الأصل بتاريخ 1 ديسمبر 2022. تم الاطلاع عليها بتاريخ 12 فبراير 2019 .
- ↑ "سلسلة إصدارات GCC 4.9 - التغييرات" . www.gnu.org.
- ↑ "ميزات OpenMP* 4.0 في مُصرّف Intel 15.0" . Software.intel.com. 13 أغسطس 2014. مؤرشف من الأصل في 16 نوفمبر 2018. تم الاطلاع عليه في 10 نوفمبر 2014 .
- ↑ "سلسلة إصدارات GCC 6 - التغييرات" . www.gnu.org.
- ↑ "مترجمات وأدوات OpenMP" . openmp.org . www.openmp.org . تم الاطلاع عليه بتاريخ 29 أكتوبر 2019 .
- 1 2 "دعم OpenMP - وثائق Clang 12" . clang.llvm.org . تم الاطلاع عليه بتاريخ 23-10-2020 .
- ↑ "GOMP — تطبيق OpenMP لـ GCC - مشروع جنو - مؤسسة البرمجيات الحرة (FSF)" . gcc.gnu.org . مؤرشف من الأصل بتاريخ 27 فبراير 2021. تم الاطلاع عليه بتاريخ 23 أكتوبر 2020 .
- ↑ "دعم OpenMP*" . إنتل . تم الاسترجاع في 23 أكتوبر 2020 .
- 1 2 أمريتكار، أميت؛ تافتي، دانيش؛ ليو، روي؛ كوفرين، ريك؛ تشابمان، باربرا (2012). "التوازي باستخدام OpenMP لأنظمة السوائل وأنظمة السوائل والجسيمات". الحوسبة المتوازية . 38 (9): 501. doi : 10.1016/j.parco.2012.05.005 .
- ↑ أمريتكار، أميت؛ ديب، سوريا؛ تافتي، دانيش (2014). "محاكاة فعّالة متوازية لـ CFD-DEM باستخدام OpenMP" . مجلة الفيزياء الحاسوبية . 256 : 501. Bibcode : 2014JCoPh.256..501A . doi : 10.1016/j.jcp.2013.09.007 .
- ↑ دعم مُسرِّع OpenMP لوحدات معالجة الرسومات
- ↑ اكتشاف وتجنب حالات التزامن في OpenMP في لغة C++
- ↑ "أليكسي كولوسوف، يفغيني ريزكوف، أندريه كاربوف: 32 مأزقًا في OpenMP لمطوري لغة C++" . مؤرشف من الأصل بتاريخ 2017-07-07 . تم الاطلاع عليه بتاريخ 2009-04-15 .
- ↑ ستيفن بلير-تشابيل، شركة إنتل، كيف تصبح خبيرًا في البرمجة المتوازية في تسع دقائق، عرض تقديمي في مؤتمر ACCU 2010
- ↑ تشين، يورونغ (15 نوفمبر 2007). "برمجيات متعددة النوى". مجلة إنتل للتكنولوجيا . 11 (4). doi : 10.1535/itj.1104.08 .
- ↑ "نتيجة OMPM2001" . خاص. 2008-01-28.
- ↑ "نتيجة OMPM2001" . خاص. 2003-04-01. مؤرشف من الأصل بتاريخ 2021-02-25 . تم الاطلاع عليه بتاريخ 2008-03-28 .
للمزيد من القراءة
- كوين، مايكل جيه، البرمجة المتوازية بلغة سي باستخدام MPI وOpenMP، ماكجرو هيل، 2004. ISBN 0-07-058201-7
- R. Chandra، R. Menon، L. Dagum، D. Kohr، D. Maydan، J. McDonald، البرمجة المتوازية في OpenMP. مورغان كوفمان، 2000. ISBN 1-55860-671-8
- آر. إيغينمان (محرر)، إم. فوس (محرر)، البرمجة المتوازية للذاكرة المشتركة باستخدام OpenMP: ورشة العمل الدولية حول تطبيقات وأدوات OpenMP، WOMPAT 2001، ويست لافاييت، إنديانا، الولايات المتحدة الأمريكية، 30-31 يوليو 2001. (سلسلة محاضرات في علوم الحاسوب). سبرينغر 2001. ISBN 3-540-42346-X
- ب. تشابمان ، ج. جوست، ر. فان دير باس، د. ج. كوك (مقدمة)، استخدام OpenMP: برمجة متوازية محمولة للذاكرة المشتركة. مطبعة معهد ماساتشوستس للتكنولوجيا (31 أكتوبر 2007). ISBN 0-262-53302-2
- توم ديكين وتيموثي جي. ماتسون: برمجة وحدة معالجة الرسومات الخاصة بك باستخدام OpenMP: قابلية نقل الأداء لوحدات معالجة الرسومات ، مطبعة معهد ماساتشوستس للتكنولوجيا، ISBN 978-0-262547536 (7 نوفمبر 2023).
- المعالجة المتوازية عبر MPI و OpenMP، م. فيروزيان، أ. نومينسن. لينكس إنتربرايز، 10/2002
- مقال في مجلة MSDN حول OpenMP
- تم أرشفة البرنامج التعليمي لـ OpenMP الخاص بـ SC08 بتاريخ 19-03-2013 على Wayback Machine (PDF) - مقدمة عملية لـ OpenMP و Mattson و Meadows، من SC08 (أوستن)
- مواصفات OpenMP مؤرشفة بتاريخ 2 مارس 2021 على موقع Wayback Machine
- ميغيل هيرمانز: البرمجة المتوازية في فورتران 95 باستخدام OpenMP (19 أبريل 2002) (PDF) (OpenMP الإصدار 1 والإصدار 2)
روابط خارجية
- واجهات برمجة التطبيقات
- عائلة لغات البرمجة C
- فورتران
- الحوسبة المتوازية
