سؤال

هل يمكن لأي من عمليات خوارزميات/حاوية STL مثل STD :: ملء, Std :: Transform يتم تنفيذها بالتوازي إذا قمت بتمكين OPENMP لمجمولتي؟ أنا أعمل مع MSVC 2008 في الوقت الحالي. أو ربما هناك طرق أخرى لجعلها متزامنة؟

شكرًا.

هل كانت مفيدة؟

المحلول

هناك عدد من المشاريع التي تهدف إلى امتلاك مكتبات نوع STL المتوازية:

  1. OpenMP مكتبة القوالب متعددة الخيوط
  2. libstdc ++ موازية
  3. HPC ++ مكتبة قالب قياسية متوازية
  4. مكتبة أنماط موازية (استعارت بلا خجل من إجابة Ashleysbrain)

نصائح أخرى

للضمان std::transform و std::fill لتكون آمنًا ، سيكون عليك كتابة نسختك الخاصة. التنفيذ المشترك لهذه الوظائف هو للتنفيذ المتسلسل.

دعونا نأخذ std::fill كمثال بسيط. عند التحويل إلى موازٍ ، ستحتاج إلى تقسيم الوظيفة إلى وظائف أصغر يمكن تنفيذها بشكل غير متزامن دون أي اعتماد بين المباراة. على سبيل المثال ، يمكن أن يملأ وظيفة فرعية واحدة النصف الأول ويمكن أن يملأ الوظيفة الفرعية الثانية النصف الثاني. سيتعين على وظيفة الوالدين تفويض (شوكة) من الوظائف الفرعية ، وانتظرهما لإنهاء (الانضمام).

والسؤال الأكبر هو ما إذا كان النفقات العامة التي تم إنفاقها في إعداد وقت التشغيل للتنفيذ المتوازي يمكن أن تعوض عن وقت التنفيذ المتوازي الفعلي. الحشوات الكبيرة سيكون لها مبرر أعلى من الحشوات الصغيرة.

ربما تكون الفكرة الأفضل هي إنشاء إصدارات آمنة من هذه الوظائف وتنفيذ مؤشرات الترابط بالتوازي ، بدلاً من تقسيم الوظائف.

قبل تقسيم الأشياء إلى مؤشرات ترابط متعددة ، حاول أولاً التحسين بالإشارة إلى البيانات. ابحث في الويب عن التصميم الموجهة للبيانات. لقد أظهرت المقالات أنه من خلال تحسين التنفيذ لتقليل ذاكرة التخزين المؤقت للمعالج ، يمكن أن يعمل البرنامج بشكل أسرع بكثير.

لا تتحدث معايير C ++ الحالية عن المواضيع على الإطلاق ، لذلك لا. هنا هو بيان أصلي أكثر أو أقل حول سلامة موضوع STL.

تعديل:

انظر إلى تنفيذ واحد مشترك (GCC) std::fill:

template<typename _ForwardIter, typename _Tp>
  void
  fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
  {
      for ( ; __first != __last; ++__first)
          *__first = __value; 
  }

من الواضح أنه ليس آمنًا للتنفيذ الموازي (والذي يتطلب تنفيذًا متخصصًا.)

وهنا امتداد GCC ل الوضع الموازي.

يوفر Visual Studio 2010 مكتبة أنماط موازية التي لديها خوارزميات نمط STL التي تنفذ بالتوازي. بالطبع ، هذا هو Microsoft خاص بـ VS2010 (وما فوق ، أعتقد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top