تحسين أداء الأداء إطار التشغيل الآلي PIRA يقترب من المهمة التي تستغرق وقتًا طويلاً وهي إنشاء قياس أداء معقول لقاعدة تعليمات برمجية غير معروفة عند استخدام Score-P. لمزيد من المعلومات يرجى الاطلاع على أوراقنا:
[PI18] | جان باتريك لير، ألكسندر هوك، كريستيان بيشوف. PIRA: أتمتة تحسين أدوات الأداء. في ورشة عمل ACM SIGPLAN الدولية الخامسة حول الذكاء الاصطناعي والأساليب التجريبية لهندسة البرمجيات وأنظمة الحوسبة المتوازية (AI-SEPS) ، الصفحات 1-10، ACM، 2018. |
[PI19] | جان باتريك لير، ألكسندرو كالوتويو، كريستيان بيشوف، فيليكس وولف. تحسين الأجهزة التلقائية لنمذجة الأداء التجريبي. في ورشة العمل الدولية حول أدوات البرمجة وتصور الأداء (ProTools) ، الصفحات 40-47، IEEE، 2019. |
[PI21] | بيتر أرزت، يانيك فيشلر، جان باتريك لير، كريستيان بيشوف. الكشف التلقائي عن اختلال توازن الحمل المنخفض في تطبيقات MPI. في Euro-Par 2021: المعالجة الموازية. ملاحظات المحاضرات في علوم الكمبيوتر، المجلد 12820 ، الصفحات 19-34، سبرينغر، 2021. |
يدير PIRA المراحل الأربع التالية (يتم تكرار 2-4):
يدعم PIRA تصفية الوظائف في وقت الترجمة ووقت التشغيل ، بما في ذلك تصفية وقت التشغيل لوظائف MPI من خلال الأغلفة التي يتم إنشاؤها تلقائيًا. في تصفية وقت الترجمة، يتم استخدام الوظائف المطلوبة فقط في وقت الترجمة، مما يقلل من تأثير القياس الإجمالي بشكل كبير. في المقابل، في تصفية وقت التشغيل، يقوم المترجم بإدراج أدوات ربط في كل وظيفة من وظائف التطبيق المستهدف، وتحدث التصفية في وقت التشغيل.
يتطلب PIRA CMake (>=3.16)، وClang/LLVM 10، وPython 3، وQt5، وOpenMPI 4. وسيعمل (أو MetaCG) على تنزيل (وإنشاء) المزيد
إذا كنت ترغب في إنشاء PIRA في بيئة لا تتوفر فيها إمكانية الوصول إلى الإنترنت، فيرجى الاطلاع على البرنامج النصي resources/build_submodules.sh
وتعديله ليناسب احتياجاتك.
استنساخ مستودع PIRA.
$> git clone https://github.com/tudasc/pira
$> cd pira
ثانيًا، قم ببناء الوحدات الفرعية التابعة باستخدام البرنامج النصي المقدم، أو قم بتمرير قيم للخيارات المختلفة (راجع معلومات الاستخدام عبر -h
للخيارات المتاحة). سيتم وضع جميع الملفات التي تم تنزيلها والتي تم إنشاؤها في external/src/
بينما سيتم وضع جميع التثبيتات في ملف external/install/
. حدد عدد عمليات الترجمة التي سيتم إنشاؤها لتجميع العناصر الخارجية لـ PIRA. سيقوم البرنامج النصي بتنزيل تبعيات PIRA في نسختها الافتراضية. تم اختبار هذه الإصدارات أيضًا في CI الخاص بنا ومن المتوقع أن تعمل.
$> cd resources
$> ./build_submodules.sh -p <ncores>
كخطوة أخيرة، سيقوم البرنامج النصي للبناء بكتابة مسارات تثبيت الوحدات الفرعية في الملف resources/setup_paths.sh
. إذا كنت ترغب في إعادة بناء PIRA، فيرجى تذكر git restore
.
نوفر أيضًا Dockerfile
(تجريبيًا) لبناء PIRA وتجربته.
$> podman build -t pira:master -f docker/Dockerfile .
عند التشغيل داخل الحاوية، على سبيل المثال، اختبارات التكامل، يرجى استدعاء البرامج النصية على النحو التالي.
$> cd resources
$> . setup_paths.sh
$> cd ../test/integration/GameOfLife # Example test case
# By default PIRA will look into $HOME/.local, which is not currently existent in the docker
# XDG_DATA_HOME signals where to put the profiling data PIRA generates
$> XDG_DATA_HOME=/tmp ./run.sh
للحصول على مثال كامل عن كيفية استخدام PIRA، قم بمراجعة البرامج run.sh
في المجلد /test/integration/*
. نقطة البداية الجيدة المحتملة هي مجلد GameOfLife
وحالة الاختبار الخاصة به.
أولاً، قم بإعداد المسارات المطلوبة عن طريق تحديد مصدر البرنامج النصي في مجلد resources
.
$> cd resources/
$> . setup_paths.sh
بعد ذلك، يمكنك تشغيل تطبيق نموذجي لـ PIRA على تطبيق بسيط جدًا للعبة Conway's Game of Life باستخدام البرنامج النصي run.sh
المتوفر في المجلد ./test/integration/GameOfLife
.
$> cd ./test/integration/GameOfLife
$> ./run.sh
يقوم البرنامج النصي بتنفيذ جميع الخطوات المطلوبة منذ البداية، أي إعداد جميع المكونات لرمز هدف جديد، لاستدعاء PIRA أخيرًا. وفي الأقسام التالية، يتم شرح الخطوات بمزيد من التفصيل. الخطوات هي:
config
إلى ملف التكوين (الوسيطة المطلوبة)--config-version [1,2]
إصدار تكوين PIRA، 2 هو الإصدار الافتراضي ويتم تشجيعه؛ 1 مهمل.--runtime-filter
استخدم تصفية وقت التشغيل، الافتراضي هو خطأ. في تصفية وقت الترجمة، لا يتم استخدام الوظائف في وقت الترجمة، مما يقلل من تأثير القياس الإجمالي بشكل كبير، ولكنه يتطلب إعادة بناء الهدف في كل تكرار. في المقابل، مع تصفية وقت التشغيل، يقوم المترجم بإدراج خطافات الأجهزة في كل وظيفة من وظائف التطبيق المستهدف.--iterations [number]
عدد تكرارات Pira، القيمة الافتراضية هي 3.--repetitions [number]
عدد تكرارات القياس، القيمة الافتراضية هي 3.--tape
الموقع الذي يجب كتابة شريط تسجيل (واسع النطاق إلى حد ما) فيه.--extrap-dir
الدليل الأساسي حيث يتم وضع بنية المجلد Extra-p.--extrap-prefix
بادئة Extra-P، يجب أن تكون عبارة عن سلسلة من الأحرف.--version
يطبع رقم إصدار تثبيت PIRA--analysis-parameters
المسار إلى ملف التكوين الذي يحتوي على معلمات التحليل لـ PGIS. مطلوب لكل من وضع Extra-P وLIDe.--slurm-config [path to slurm cfg file]
يتيح تشغيل الكود الهدف على مجموعة slurm. هناك حاجة إلى ملف التكوين slurm. يرجى الاطلاع على هذا القسم لمزيد من المعلومات. --hybrid-filter-iters [number]
أعد الترجمة بعد تكرارات [number]، واستخدم تصفية وقت التشغيل بينهما.--export
قم بإرفاق نماذج Extra-P التي تم إنشاؤها وأحجام مجموعة البيانات في ملف IPCG الخاص بالهدف.--export-runtime-only
--export
؛ يُرفق فقط قيمة وقت التشغيل المتوسطة لجميع التكرارات بالوظائف. متاح فقط عند عدم استخدام Extra-P.--load-imbalance-detection [path to cfg file]
لتمكين وتكوين وضع اكتشاف خلل التحميل. يرجى قراءة هذا القسم لمزيد من المعلومات. يستخدم PIRA معلومات التعليمات البرمجية المصدر لإنشاء أجهزة أولية وتحديد الوظائف التي سيتم إضافتها إلى الأجهزة أثناء التحسين التكراري. فهو يوفر أداة رسم بياني للاتصال تعتمد على Clang تقوم بجمع كل المعلومات المطلوبة وإخراج المعلومات في ملف .json
. يمكنك العثور على أداة cgcollector
في الدليل الفرعي ./extern/src/metacg/cgcollector
. يتطلب PIRA أن يكون ملف callgraph بتنسيق ملف MetaCG في الإصدار 2 (MetaCG v2).
يمكن العثور على مزيد من المعلومات حول CGCollector ومكوناته في وثائق MetaCG.
عادةً ما يتم تطبيق CGCollector في خطوتين.
في البداية، يتم استدعاء cgc
في كل ملف مصدر في المشروع. على سبيل المثال:
for f in $(find ./src -type f ( -iname "*.c" -o -iname "*.cpp" ) ); do
cgc --metacg-format-version=2 $f
done
يتم بعد ذلك دمج ملفات .ipcg
التي تم إنشاؤها في الخطوة 1 في ملف عام باستخدام cgmerge
.
"null"
2. إذا كان مشروعك يحتوي على أكثر من وظيفة main
واحدة، فيرجى دمج الملف مع الوظيفة main
الصحيحة فقط. echo "null" > $IPCG_FILENAME
find ./src -name "*.ipcg" -exec cgmerge $IPCG_FILENAME $IPCG_FILENAME {} +
يجب وضع الرسم البياني النهائي في دليل محلل الرسم البياني. نظرًا لاستخدام PGIS حاليًا لتحليل CG، يتم نسخ ملف البرنامج بأكمله الذي تم إنشاؤه إلى دليل PGIS. حاليًا، من المهم تسمية الملف الموجود في دليل PGIS وفقًا للنمط item_flavor.mcg
. يرمز العنصر إلى التطبيق المستهدف. المزيد عن مصطلحات النكهة والعنصر في القسم التالي.
# Assuming $PIRA holds the top-level PIRA directory
$> cp my-app.mcg $PIRA/extern/install/pgis/bin/item_flavor.mcg
يحتوي تكوين PIRA على كافة المعلومات المطلوبة لـ PIRA لتشغيل العملية التلقائية. يمكن أن تكون الأدلة المختلفة التي يجب تحديدها في ملف التكوين إما مسارات مطلقة ، أو مسارات مرتبطة بمسار تنفيذ pira . قد تحتوي المسارات على متغيرات البيئة، على سبيل المثال، $HOME
. الأمثلة مأخوذة من مثال GameOfLife في ./test/integration/GameOfLife
.
يحدد المستخدم: الدليل الذي سيتم البحث فيه عن العناصر المحددة لاحقًا، في المثال، الدليل هو ./gol/serial_non_template
. يتم إعطاء هذه الدلائل أسماء مستعارة، والتي يتم إلغاء الإشارة إليها باستخدام العلامة '%'. العنصر في PIRA هو تطبيق مستهدف، تم إنشاؤه بطريقة معينة، وهذا هو سبب تجميعه في التكوين ضمن builds .
{
"builds": {
"%gol": {
"items": {
"gol": {
...
}
}
}
}
"directories": {
"gol": "./gol/serial_non_template"
}
}
يحدد كل عنصر المحلل الذي يجب استخدامه. يأتي المحلل الافتراضي مزودًا بـ PIRA، ويمكن العثور على المصادر في ./extern/src/metacg/pgis
أو التثبيت في ./extern/install/pgis/bin
، على التوالي. المحلل مسؤول عن توجيه تحسين الأجهزة، وبالتالي فهو جزء أساسي من إطار عمل PIRA.
يحدد حقل argmap الوسائط المختلفة التي يتم تمريرها إلى التطبيق الهدف عند تشغيل تجارب الأداء. يتم تحديد كيفية تمرير الوسائط إلى التطبيق المستهدف بواسطة مصممي خرائط مختلفين. في المثال، يتم استخدام مخطط خطي ، والذي يقوم ببساطة بتكرار قيم المعلمة المسماة size بالترتيب الوارد في القائمة.
"argmap": {
"mapper": "Linear",
"size": [50, 80, 110, 150, 300, 500]
}
حقل المكعبات هو الموقع الذي يجب أن يقوم PIRA بتخزين ملفات تعريف Score-P التي تم الحصول عليها. سيقوم بإنشاء شجرة دليل في ذلك الموقع، بحيث يمكن للمستخدم، بعد انتهاء PIRA، أيضًا استدعاء أداة النمذجة Extra-P بسهولة عن طريق تمرير الموقع المعني، على سبيل المثال، /tmp/pira في المثال.
"cubes": "/tmp/pira"
يضيف مجال النكهات مستوى آخر من التميز المحتمل، حيث يمكن بناء التطبيقات المستهدفة بنكهات مختلفة. من الأمثلة على ذلك تحديد مكتبات رياضية مختلفة يجب أن يرتبط بها التطبيق المستهدف.
أخيرًا، يقوم دليل الوظائف بتوجيه PIRA إلى الموقع الذي يبحث فيه عن وظائف Python المقدمة من المستخدم والتي تخبر PIRA في النهاية بكيفية إنشاء التطبيق المستهدف وتشغيله وتحليله. في المثال، تتم الإشارة إلى PIRA إلى دليل يسمى functors نسبة إلى موقع التكوين.
"flavors": [
"ct"
],
"functors": "./functors",
"mode": "CT"
يتم تجاهل حقل الوضع في هذا الإصدار من PIRA.
اعتبارًا من الآن، يحتاج المستخدم إلى تنفيذ خمس وظائف مختلفة:
analyze_<ITEM>_<FLAVOR>.py
: يستدعي المحلل.clean_<ITEM>_<FLAVOR>.py
: ينظف دليل البناء.<ITEM>_<FLAVOR>.py
: إنشاء النسخة المُجهزة.no_instr_<ITEM>_<FLAVOR>.py
: ينشئ نسخة الفانيليا.runner_<ITEM>_<FLAVOR>.py
: يقوم بتشغيل التطبيق المستهدف. تدعم الوظائف عمومًا وضعين للاستدعاء: نشط وسلبي . يخبر العامل PIRA بالوضع الذي يستخدمه عن طريق تعيين القيمة المعنية على True
في القاموس الذي يتم إرجاعه بواسطة الدالة get_method()
.
في الوضع النشط، يقوم العامل نفسه باستدعاء الأوامر المطلوبة، على سبيل المثال، لإنشاء البرنامج. عند استدعائه، يتم تمرير المعلمة **kwargs
التي تحتوي، على سبيل المثال، على الدليل الحالي ومثيل لصدفة العملية الفرعية.
يقوم الوضع الخامل بإرجاع الأوامر المطلوب تنفيذها فقط، على سبيل المثال، السلسلة make
لاستدعاء ملف Makefile بسيط في دليل المستوى الأعلى للعنصر. يتم أيضًا تمرير معلمة kwargs
التي تحتوي على معلومات محددة، مثل القيم المحددة مسبقًا اللازمة لإضافتها إلى CXXFLAGS أو إشارات الرابط الإضافية. يمكن العثور على مثال للعامل السلبي في examples
وأدلة test
. حاليًا، تستخدم جميع الوظائف المنفذة الوضع السلبي.
يقوم PIRA بتمرير وسيطات الكلمات الرئيسية التالية إلى جميع الوظائف. بالإضافة إلى ذلك، قد تقوم مكونات PIRA المختلفة بتمرير وسائط إضافية.
هام : نقوم الآن بشحن إصدار Score-P الخاص بنا. وبالتالي، لم يعد مطلوبًا ضبط أوامر الترجمة في PIRA. تحقق من الوظائف في test/integration/AMG2013
على سبيل المثال استخدامات المعلومات المختلفة.
حاليًا، لا يتم تمرير أية معلومات إلى جميع العاملين
[0]
يصل إلى الوسيطة الأولى، و [1]
الثانية، وهكذا..so
الذي يقوم بتنفيذ وظائف غلاف MPI (أمر بالغ الأهمية لتصفية MPI). هناك حاجة إلى معلمات إضافية لبعض أوضاع التحليل. على وجه التحديد، يتطلب تحليل PIRA LIDe (انظر أدناه) وتحليل النمذجة Extra-P معلمات يوفرها المستخدم. قم بإنشاء ملف JSON وقم بتوفير مساره إلى PIRA باستخدام مفتاح --analysis-parameters
-switch. يحتوي المثال التالي على معلمات لوضع النمذجة Extra-P. الاستراتيجيات المتاحة لتجميع نماذج Extra-P المتعددة (عند استدعاء دالة في سياقات مختلفة) هي: FirstModel
و Sum
و Average
و Maximum
.
{
"Modeling": {
"extrapolationThreshold": 2.1,
"statementThreshold": 200,
"modelAggregationStrategy": "Sum"
}
}
لمزيد من التفاصيل حول ميزة اكتشاف خلل التحميل، يرجى الرجوع إلى [PI21]. قم بتزويد استدعاء PIRA بمسار إلى ملف التكوين باستخدام المعلمة --load-imbalance-detection
. مطلوب أن يكون لملف JSON البنية التالية:
{
"metricType": "ImbalancePercentage",
"imbalanceThreshold": 0.05,
"relevanceThreshold": 0.05,
"contextStrategy": "None",
"contextStepCount": 5,
"childRelevanceStrategy": "RelativeToMain",
"childConstantThreshold": 1,
"childFraction": 0.001
}
لتشغيل PIRA على مجموعة باستخدام مدير أحمال عمل SLURM، قم باستدعائه باستخدام علامة --slurm-config
. قم بإعطاء المسار إلى ملف تكوين النظام الدفعي الخاص بك معه. راجع اختبارات التكامل الملحقة بـ _Slurm
( test/integration/*_Slurm/
). يدعم PIRA حاليًا أنظمة الدُفعات مع مدير أحمال العمل SLURM. يدعم PIRA استخدام نظام module
، والذي يمكن العثور عليه في مجموعات الطين.
ملف تكوين النظام الدفعي هو ملف JSON، وهو منظم على النحو التالي:
{
"general": {
"backend": "slurm",
"interface": "pyslurm",
"timings": "subprocess"
},
"module-loads": [
{
"name": "gcc",
"version": "8.5"
},
{
"name": "llvm",
"version": "10.0.0",
"depends-on": [
{
"name": "gcc",
"version": "8.5"
}
]
}
],
"batch-settings": {
"time_str": "00:10:00",
"mem_per_cpu": 3800,
"number_of_tasks": 1,
"partition": null,
"reservation": null,
"account": "your_account_here",
"cpus_per_task": 96
}
}
انفصال:
general
: يتيح لك اختيار الطريقة التي ستنفذ بها PIRA التعليمات البرمجية الخاصة بك على النظام الدفعي. نظرًا لأن كل خيار في هذا القسم اختياري، يمكنك حذف القسم بأكمله، إذا كنت موافقًا على استخدام الإعدادات الافتراضية:backend
: ما هو مدير عبء العمل الذي يجب استخدامه. الاختيارات: slurm
، لمدير عبء العمل slurm. الافتراضي: slurm
، لذلك اختياري.interface
: بالطريقة التي يجب أن يتفاعل بها PIRA مع مدير نظام الدُفعات لديك. بالنسبة للواجهة الخلفية لـ SLURM، فهي: pyslurm
، لاستخدام PySlurm (يتطلب هذا تثبيت PySlurm، راجع هذا القسم؛ sbatch-wait
، لاستخدام sbatch
القياسي مع علامة --wait
؛ os
، sbatch
التفاعل العشوائية squeue
. الافتراضي: pyslurm
، لذلك اختياري.timings
: كيف ينبغي أن يتم توقيت الكود المستهدف. الاختيارات: subprocess
، للتوقيت باستخدام غلاف بايثون و os.times
في عملية فرعية (تمامًا كما تفعل PIRA إذا تم تشغيلها محليًا)؛ os
، لاستخدام /usr/bin/time
. الافتراضي: subprocess
، وبالتالي اختيارية.force-sequential
: false
افتراضي. اضبط على true
لإجبار PIRA/نظام الدفعات الخاص بك على تنفيذ جميع عمليات التشغيل بترتيب تسلسلي (تنفيذ واحد فقط للكود الهدف في كل مرة). وهذا يعني أن PIRA سوف يعتني بأن نظام الدُفعات الخاص بك يقوم بتشغيل التكرارات، بالإضافة إلى وظائف مختلفة في قياس التجارب بترتيب تسلسلي. إذا تم ضبطه على/يسار على false
PIRA، فسوف يحاول توجيه النظام الدفعي للقيام بأكبر عدد ممكن من عمليات التنفيذ في كل تكرار بالتوازي.module-loads
: غير مستخدم حاليًا في PIRA، والعمل جارٍ! حاليًا، تحتاج إلى تحميل جميع الوحدات يدويًا، قبل بدء PIRA! يعني للوحدات التي يجب تحميلها مع نظام module
. يتطلب هذا وجود واحد في مكانه (يمكن استخدام module load
الأوامر module purge
بواسطة PIRA). إذا لم يكن لديك نظام module
، أو لا ترغب في استخدامه، فإما أن تحذف هذا القسم تمامًا، أو قم بتعيين "module-loads": null
. لتحديد الوحدات التي يجب أن يقوم PIRA بتحميلها، حدد قائمة الوحدات، كما في المثال أعلاه.name
.version
اختياري، إذا لم يتم تقديمه، فسوف يعتمد على ما يقوم نظام module
بتحميله كإصدار الوحدة الافتراضي. يوصى دائمًا بإعطاء الإصدارات بشكل صريح.depends-on
اختياري أيضًا. أعط قائمة بالوحدات التي تعتمد عليها هذه الوحدة. يجب أن يكون لهذه الوحدات name
ويمكن أن يكون لها version
محدد اختياريًا. يتم استخدام التبعيات المحددة هنا بواسطة PIRA لتحديد الترتيب الذي يجب تحميل الوحدات بهnull
، فمن المفترض أن هذه الوحدة ليس لها تبعيات.depends-on
PIRA فسوف (يحاول) تحميل الوحدات بنفس الترتيب المحدد في ملف التكوين.batch-setting
: خيارات الأجهزة والوظائف الفعلية لنظام الدُفعات. بعض الخيارات في القسم إلزامية، لا يمكنك حذف هذا القسم.time
: خيار sbatch --time
، إلزامي.mem-per-cpu
: خيار sbatch --mem-per-cpu
، إلزامي.ntasks
: خيار sbatch --ntasks
، إلزامي.partition
، reservation
، account
(كلها افتراضية إلى null
= غير معطى)، cpus-per-task
(افتراضية إلى 4
)، exclusive
(افتراضية إلى true
؛ غير مدعومة مع pyslurm
)، و cpu-freq
(الإعدادات الافتراضية هي null
).sbatch
لا يمكنك تحديدها في هذا التكوين. ويرجع ذلك إلى بعض الخيارات التي يستخدمها PIRA داخليًا، على سبيل المثال خيار --array
، لتعيين التكرارات لمصفوفات المهام. تعتمد كيفية تثبيت PySlurm على مجموعتك وإصداره بشكل كبير على إصدار SLURM الخاص بك وتثبيت SLURM الخاص بك. حل التثبيت والتعبئة لـ pyslurm مع PIRA قيد التنفيذ. الرجوع إلى الملف التمهيدي الخاص بهم. يمكنك تجربة بعض ما يلي:
include
و lib
dir.python3 setup.py build --slurm-lib=/opt/slurm/21.08.6/lib --slurm-inc=/opt/slurm/21.08.6/include
python3 setup.py install --slurm-lib=/opt/slurm/21.08.6/lib --slurm-inc=/opt/slurm/21.08.6/include
.