هل سبق لك أن تساءلت كيف تُنجز حاسوبك جميع المهام في آن واحد؟ من تشغيل التطبيقات، إلى تصفح الإنترنت، وحتى لعب الألعاب ، كل ذلك يحدث في نفس الوقت! ذلك بفضل "المعالجة المتوازية" ، والتي يمكن القول إنها تُشبه "المطبخ الكبير" للبرمجة ، حيث تُقسم الوصفات ( المهام ) على طهاة ( الأنوية ) عدة ، لإنهاء كل شيء بسرعة ، و بأفضل كفاءة!
تخيل أنك ترغب في تحضير وجبة دسمة تحتوي على سلطة ، وحساء ، وصحن من اللحم . بدلًا من إعداد كل شيء على موقد واحد ، يمكنك استخدام عدة أفران ( أنوية ) ، ليُعد كل طبق في وقت مُناسب ، وتستمتع بكل شيء في نفس الوقت ! هذا هو جوهر "البرمجة التفرعية" ، حيث نستفيد من قوة الأنوية المُتعددة في المعالجات المُعاصرة لإنجاز المهام بسرعة ومُقدرة غير مسبوقة .
في نواة هذه الفكرة تُوجد "الأنوية" ، و التي هي وحدات المُعالجة في حاسوبك ، و يمكن تصورها كـ "المُعالجين الصغار" ، كل واحد منهم يقوم بمهام مُعينة . في الماضي ، كانت الحواسيب تُجهّز بـ نواة واحدة فقط ، وهو ما يُعادل "الطباخ الوحيد" الذي يُحاول إعداد جميع الطبخات في نفس الوقت ، و من الطبيعي أن تُؤدي هذه الطريقة إلى بطء واضح . لكن مع تطور التكنولوجيا ، أصبحت الحواسيب تُزود بـ "أنوية متعددة" ، و التي تُشبه "فريق من الطهاة" ، يمكن لكل واحد منهم تحضير طبق مختلف في نفس الوقت ، و بهذا نُقلّل الوقت الكلي لإعداد الوجبة .
يمكن تصنيف "البرمجة التفرعية" إلى نوعين أساسيين :
البرمجة المتوازية المتزامنة: تُشبه هذه الطريقة "إعداد الطبق على عدة مواقد في نفس الوقت" ، حيث تُنفذ الأجزاء المختلفة من برنامجك على الأنوية المُتعددة في نفس الوقت ، وتُشبه هذه الطريقة "التعاون بين الطهاة" ، حيث يعملون معًا لإنجاز الوجبة بسرعة ، وتُعد هذه الطريقة مثالية للمهام التي يمكن تقسيمها إلى جزءات مُستقلة ، مثل معالجة الصور أو تحليل البيانات .
البرمجة المتوازية غير المتزامنة: تُشبه هذه الطريقة "إعداد طبق على موقد واحد ، لكن بخطوات مُتتابعة" ، حيث تُنفذ الأجزاء المختلفة من برنامجك على الأنوية المُتعددة بشكل مُتتابعة ، ولكن بدون انتظار إكمال جزء مُعين قبل بدء الجزء اللاحق ، وتُشبه هذه الطريقة "طباخ يُحضر الطبق خطوة بخطوة" ، ويُمكن استخدام هذه الطريقة للمهام التي لا تُمكن تقسيمها إلى أجزاء مُستقلة ، مثل التعامل مع الواجهة المُستخدم .
في البرمجة التفرعية ، يُصبح التواصل بين الأنوية عاملًا مُهمًا ، وتُشبه هذه الطريقة "تواصل الطاقم في المطبخ" ، حيث يُبلغ كل طباخ الآخرين بـ انتهاء طبقه ، ليُصبح الجميع على جاهزية للخطوة اللاحقة . و يمكن لـ "البرمجة التفرعية" أن تُساعد في التغلب على تحديات مُعينة في تطوير البرامج ، مثل :
لتوضيح هذه المفاهيم ، سنُقدم أمثلة عملية لـ "البرمجة التفرعية" ، و سنستخدم لغة برمجة 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" أو مُكتبات أخرى لـ البرمجة التفرعية ، و لا تنسى أن تُراقب أداء برامجك ، و تحسينها بشكل مستمر .
© 2020 All Rights Reserved. Information Network