<< العودة English

برمجة متعددة الأنوية: رحلة إلى عالم المعالجة الموازية

هل سبق لك أن تساءلت كيف تُنجز حاسوبك جميع المهام في آن واحد؟ من تشغيل التطبيقات، إلى تصفح الإنترنت، وحتى لعب الألعاب ، كل ذلك يحدث في نفس الوقت! ذلك بفضل "المعالجة المتوازية" ، والتي يمكن القول إنها تُشبه "المطبخ الكبير" للبرمجة ، حيث تُقسم الوصفات ( المهام ) على طهاة ( الأنوية ) عدة ، لإنهاء كل شيء بسرعة ، و بأفضل كفاءة!

تخيل أنك ترغب في تحضير وجبة دسمة تحتوي على سلطة ، وحساء ، وصحن من اللحم . بدلًا من إعداد كل شيء على موقد واحد ، يمكنك استخدام عدة أفران ( أنوية ) ، ليُعد كل طبق في وقت مُناسب ، وتستمتع بكل شيء في نفس الوقت ! هذا هو جوهر "البرمجة التفرعية" ، حيث نستفيد من قوة الأنوية المُتعددة في المعالجات المُعاصرة لإنجاز المهام بسرعة ومُقدرة غير مسبوقة .

رحلة إلى عالم الأنوية

في نواة هذه الفكرة تُوجد "الأنوية" ، و التي هي وحدات المُعالجة في حاسوبك ، و يمكن تصورها كـ "المُعالجين الصغار" ، كل واحد منهم يقوم بمهام مُعينة . في الماضي ، كانت الحواسيب تُجهّز بـ نواة واحدة فقط ، وهو ما يُعادل "الطباخ الوحيد" الذي يُحاول إعداد جميع الطبخات في نفس الوقت ، و من الطبيعي أن تُؤدي هذه الطريقة إلى بطء واضح . لكن مع تطور التكنولوجيا ، أصبحت الحواسيب تُزود بـ "أنوية متعددة" ، و التي تُشبه "فريق من الطهاة" ، يمكن لكل واحد منهم تحضير طبق مختلف في نفس الوقت ، و بهذا نُقلّل الوقت الكلي لإعداد الوجبة .

أساسيات البرمجة التفرعية: السباق على الوقت

يمكن تصنيف "البرمجة التفرعية" إلى نوعين أساسيين :

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

  2. البرمجة المتوازية غير المتزامنة: تُشبه هذه الطريقة "إعداد طبق على موقد واحد ، لكن بخطوات مُتتابعة" ، حيث تُنفذ الأجزاء المختلفة من برنامجك على الأنوية المُتعددة بشكل مُتتابعة ، ولكن بدون انتظار إكمال جزء مُعين قبل بدء الجزء اللاحق ، وتُشبه هذه الطريقة "طباخ يُحضر الطبق خطوة بخطوة" ، ويُمكن استخدام هذه الطريقة للمهام التي لا تُمكن تقسيمها إلى أجزاء مُستقلة ، مثل التعامل مع الواجهة المُستخدم .

مُبادئ البرمجة التفرعية: العمل معًا لإنجاز المهمة

في البرمجة التفرعية ، يُصبح التواصل بين الأنوية عاملًا مُهمًا ، وتُشبه هذه الطريقة "تواصل الطاقم في المطبخ" ، حيث يُبلغ كل طباخ الآخرين بـ انتهاء طبقه ، ليُصبح الجميع على جاهزية للخطوة اللاحقة . و يمكن لـ "البرمجة التفرعية" أن تُساعد في التغلب على تحديات مُعينة في تطوير البرامج ، مثل :

  1. الوقت المُطلوب لإنجاز المهام المُعقدة : يمكن للبرمجة التفرعية أن تُقلّل من وقت تنفيذ المهام بـ استغلال الأنوية المُتعددة ، و تُشبه هذه الطريقة "إنجاز الطبخ بسرعة بـ استخدام عدة مواقد" .
  2. كفاءة استخدام الموارد : يمكن للبرمجة التفرعية أن تُحسّن من كفاءة استخدام الموارد ، و تُشبه هذه الطريقة "استخدام جميع المواقد في المطبخ بشكل كامل و فعال" .
  3. قدرة التكيف : يمكن للبرمجة التفرعية أن تُساعد في تطوير البرامج التي تُمكن من التكيف مع البيئات المُختلفة ، و تُشبه هذه الطريقة "قدرة المطبخ على تلبية احتياجات جميع الضيوف" .

أمثلة عملية : إطلاق العنان لـ "الأنوية"

لتوضيح هذه المفاهيم ، سنُقدم أمثلة عملية لـ "البرمجة التفرعية" ، و سنستخدم لغة برمجة C++ ، و سنستخدم مكتبة "OpenMP" ، و التي تُسهّل من عملية البرمجة التفرعية .

#include <iostream>
#include <omp.h>

int main() {
  // تحديد عدد الأنوية
  int num_threads = omp_get_num_procs(); 
  std::cout << "عدد الأنوية: " << num_threads << std::endl;

  // تحديد عدد العناصر في المصفوفة
  int n = 1000000; 

  // إنشاء مصفوفة عشوائية
  double* array = new double[n];
  for (int i = 0; i < n; i++) {
    array[i] = (double)rand() / RAND_MAX;
  }

  // حساب مجموع العناصر 
  double sum = 0.0;
  #pragma omp parallel for reduction(+:sum)
  for (int i = 0; i < n; i++) {
    sum += array[i];
  }

  std::cout << "مجموع العناصر: " << sum << std::endl;

  // تحرير الذاكرة
  delete[] array;

  return 0;
}

في هذا الرمز ، نستخدم "OpenMP" لتحديد عدد الأنوية المُتاحة و إجراء حساب مجموع العناصر في مصفوفة ، حيث يُقسّم الرمز هذه المهمة على الأنوية المُتعددة ، و يُساعد "reduction" في تجميع النتائج من جميع الأنوية .

مستقبل البرمجة التفرعية: مُستقبل قوي

مع تطور الأنوية المُتعددة و ظهور "الأنوية المُتعددة الأساسية" ، تُصبح "البرمجة التفرعية" أكثر أهمية من أي وقت مُضى . و تُعد هذه الطريقة مُستقبل تطوير البرامج ، و تُمكن من إنجاز المهام المُعقدة بسرعة و كفاءة ، و تُساعد في تحقيق أفضل أداء لـ الأجهزة المُعاصرة .

دعوة للإلهام

يُمكن لك الآن البدء في استكشاف عالم "البرمجة التفرعية" و استخدام هذه الطرق لتحسين أداء برامجك . تذكر أن تُركز على تقسيم المهام بشكل فعال و استخدام "OpenMP" أو مُكتبات أخرى لـ البرمجة التفرعية ، و لا تنسى أن تُراقب أداء برامجك ، و تحسينها بشكل مستمر .