سؤال

في برنامج 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top