إيقاف تشغيل OpenMP
-
20-09-2019 - |
سؤال
في برنامج C ++ الخاص بي ، أرغب في تشغيله القابل للتنفيذ أحيانًا مع وأحيانًا دون استخدام OpenMP (أي متعدد الخيوط أو الخيوط الفردية). أنا أفكر في أي من حالتين التاليتين كيف يستخدم الكود الخاص بي OPENMP:
(1) افترض أن الكود الخاص بي هو فقط #include <omp.h>
و OpenMP التوجيهات.
(2) مثل (1) والرمز الخاص بي يدعو وظائف OpenMP مثل omp_get_thread_num()
.
لكي لا يكون لديك رمز مختلف لتشغيل مختلف ، هل هي الطريقة الوحيدة باستخدام بعض متغير premompiler المحدد ذاتيًا للحراسة حيث يظهر OpenMP في الكود الخاص بي؟
شكرا مع تحياتي!
المحلول
مرحبًا أسهل طريقة للقيام بذلك
omp_set_num_threads(m_iUseableProcessors);
أين m_iUseableProcessors
هو عدد المعالجات التي تريد تقسيم الحساب. لا أعرف كيف أفعل ذلك بدون وظائف OpenMP. ربما يمكنك #ifdef
لهم ، ولكن هذا يجعلك تقوم بإيقاف تشغيل OpenMP في وقت الترجمة.
نصائح أخرى
يمكنك استخدام متغير البيئة:
set OMP_NUM_THREADS=1
في الواقع ، لن يتم إيقاف تشغيل OpenMP. سوف يجبر OpenMP على إنشاء موضوع واحد فقط للتطبيق. إنه يعمل دون إعادة التجميع. يمكنني استخدام هذا المتغير لاختبار قابلية التوسع في مؤشرات الترابط 1 ، 2 ، 3 ، 4 إلخ.
يمكنك وضع التضمين على النحو التالي:
#ifdef _OPENMP_
#include<omp.h>
#endif
الآن إذا قمت بتشغيل برنامجك بدون علم -FopenMP ، فسيتجاهل توجيهات OpenMP
بالإضافة إلى اقتراح _OPENMP
, ، قد تجد أنه من المفيد استخدام C99's _Pragma
(أو __pragma
, ، إذا كنت تستخدم بعض المترجمين C ++ - انظر هذا السؤال stackoverflow للحصول على تفاصيل) لمنع التناثر مع الكود الخاص بك #ifdef _OPENMP
و #endif
, ، وبالتالي تقليل الخطوط المرتبطة بالتجميع الشرطي بواسطة 3x ، وإعادة التحكم في حالات O (1) على مثيلات O (N) من تعليقات OpenMP.
على سبيل المثال ، أستخدم النمط التالي في رموز OpenMP الخاصة بي C99. يجب أن تكون التغييرات في دعم C ++ متواضعة إلى حد ما ، على الرغم من أن المترجمات محددة (في هذه الحالة ، مثل وحدات الماكرو __GNUC__
, __clang__
, __INTEL_COMPILER
, ، وما إلى ذلك قد تكون مفيدة).
#ifndef PRAGMA_OPENMP_H
#define PRAGMA_OPENMP_H
#if defined(_OPENMP) && ( __STDC_VERSION__ >= 199901L )
#define PRAGMA(x) _Pragma(#x)
#define OMP_PARALLEL PRAGMA(omp parallel)
#define OMP_PARALLEL_FOR PRAGMA(omp parallel for schedule(static))
#define OMP_FOR PRAGMA(omp for schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE(n) PRAGMA(omp parallel for collapse(n) schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE2 OMP_PARALLEL_FOR_COLLAPSE(2)
#define OMP_PARALLEL_FOR_COLLAPSE3 OMP_PARALLEL_FOR_COLLAPSE(3)
#define OMP_PARALLEL_FOR_COLLAPSE4 OMP_PARALLEL_FOR_COLLAPSE(4)
#define OMP_PARALLEL_FOR_REDUCE_ADD(r) PRAGMA(omp parallel for reduction (+ : r) schedule(static))
#else
#warning No OpenMP, either because compiler does not understand OpenMP or C99 _Pragma.
#define OMP_PARALLEL
#define OMP_PARALLEL_FOR
#define OMP_FOR
#define OMP_PARALLEL_FOR_COLLAPSE(n)
#define OMP_PARALLEL_FOR_COLLAPSE2
#define OMP_PARALLEL_FOR_COLLAPSE3
#define OMP_PARALLEL_FOR_COLLAPSE4
#define OMP_PARALLEL_FOR_REDUCE_ADD(r)
#endif
#endif // PRAGMA_OPENMP_H