GPU Drano هي أداة تحليل ثابت لبرامج GPU. أحد التحليلات في GPU Drano هو العثور على وصول الذاكرة غير المخصصة في رمز CUDA. التحليل الآخر المدعوم من GPU Drano هو تحليل لإثبات استقلال حجم الكتل لبرامج GPU.
خيوط حزمة وحدات معالجة الرسومات الحديثة في الاعوجارات. جميع المواضيع في عمليات الاعوجاج تؤدي عمليات في Lockstep. يمكن تجميع الوصول إلى مواقع الذاكرة المختلفة في تحميل/متجر واحد إذا كانت الذاكرة مجاورة أو قريبة بما يكفي في الذاكرة. عندما تكون الذاكرة التي يتم الوصول إليها بواسطة WARP متباعدين ، يلزم تحميل/متاجر متعددة لإكمال معاملة الذاكرة ، ونقول إن الوصول غير مصقول .
يقال إن نواة GPU هي مستقلة بحجم كتلة ، إذا كانت تعديل حجم الكتلة مع الحفاظ على إجمالي عدد الخيوط نفسها ، لا يكسر وظائف البرنامج. يعد هذا ضروريًا لضبط حجم الكتلة الصحيح في برامج GPU ، والتي يتم استخدامها غالبًا لتحسين أداء البرنامج.
لقد قمنا أيضًا بتنفيذ تحليل ديناميكي لتحديد الوصول غير المغطى ، وهو متوفر في هذا المستودع.
يتم تنفيذ GPU Drano كمرسل مترجم لـ LLVM باستخدام تطبيق CUDA مفتوح المصدر من Google: gpucc . لذلك ، يقترن درانو بإحكام مع LLVM.
يتطلب Drano الإصدار LLVM 6.0 أو الأحدث. كما يتطلب مجموعة أدوات CUDA (الإصدار 7.5 أو أحدث) من NVIDIA. تم اختباره على Ubuntu 16.04 LTS ، ولكن يجب أن يعمل مع معظم أنظمة Linux الموجودة.
التحليل الثابت نفسه لا يتطلب وحدة معالجة الرسومات. ومع ذلك ، لتنفيذ البرامج وتشغيل anlaysis الديناميكي ، يلزم اتفاق NVIDIA GPU والسائقين المتوافقة. تحقق من متطلبات نظام NVIDIA لمزيد من المعلومات.
يمكن العثور على تفاصيل الخوارزمية وخيارات التصميم في الأوراق التالية:
البرنامج النصي installnrun.sh مع المشروع تفاصيل الخطوات المطلوبة لإنشاء وتنفيذ GPU Drano على نظام Ubuntu. لتشغيل البرنامج النصي ،
ROOT_DIR على المسار إلى المجلد الذي تم تنزيله.sh installnrun.shهذا من شأنه تثبيت GPU Drano تلقائيًا على نظام Linux. نصف كذلك خطوات التثبيت لتثبيت تحليل الوصول غير المُخفف هنا. يمكن إجراء تثبيت تحليل الاستقلال بحجم الكتلة (يشار إليه أيضًا باسم تحليل ثبات حجم الكتلة) بشكل مشابه.
احصل على مصدر LLVM:
تأكد من تثبيت subversion . قم بتنزيل أحدث إصدار من LLVM:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
احصل على مصدر clang:
قم بتغيير دليل العمل الحالي الخاص بك إلى llvm/tools/ وتحقق من clang من مستودع SVN:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
أضف GPU Drano إلى LLVM:
نسخ GPU DRANO's src/ Folder في الدليل llvm/lib/Transforms/UncoalescedAnalysis في رمز المصدر الخاص بك:
cp -r src/abstract-execution/* llvm/lib/Transforms/UncoalescedAnalysis
cp -r src/uncoalesced-analysis/* llvm/lib/Transforms/UncoalescedAnalysis
سيؤدي ذلك إلى إنشاء مجلد يسمى llvm/lib/Transforms/UncoalescedAnalysis/ . يجب علينا تسجيل تمريرنا مع نظام بناء LLVM ، cmake . لذلك ، add_subdirectory(UncoalescedAnalysis) إلى llvm/lib/Transforms/CMakeLists.txt
نموذج ملف cmakelists.txt:
$> more CMakeLists.txt
add_subdirectory(Utils)
add_subdirectory(Instrumentation)
add_subdirectory(InstCombine)
add_subdirectory(Scalar)
add_subdirectory(IPO)
add_subdirectory(Vectorize)
add_subdirectory(Hello)
add_subdirectory(ObjCARC)
add_subdirectory(Coroutines)
add_subdirectory(UncoalescedAnalysis)
بناء LLVM و GPU Drano:
من الدليل الجذر لـ Drano ، قم بإنشاء build/ دليل. ثم ، قم بتغيير الدليل إلى build/ الدليل. تأكد من تثبيت Cmake على النظام. تنفيذ الأوامر التالية هنا:
cmake ../llvm
make
هذا هو cmake مع المسار إلى دليل LLVM ( ../llvm ). CMake تكوين LLVM لنظامك. يجب أن ينشئ عدة ملفات في دليل العمل الحالي ( build/ ). الأمر make البناء LLVM و Drano.
من الناحية المثالية ، استخدم make -j N حيث N هو عدد النوى الخاصة بك للبناء مع بالتوازي مع أن LLVM يستغرق وقتًا طويلاً للبناء.
إشعار : يأخذ LLVM Build كمية كبيرة من الذاكرة لتجميعها ، وتحديداً في خطوة الارتباط. إذا كان لديك أقل من 8 جيجابت من ذاكرة الوصول العشوائي ، فقد تفشل LLVM في البناء. إذا كان الأمر كذلك ، يمكنك إعادة تشغيل make بدون خيار -j . سيؤدي ذلك إلى إعادة ترجمة الأجزاء الفاشلة من البناء فقط ، ولا يزال يوفر وقتًا أطول من عدم استخدام -j من البداية.
تثبيت LLVM و GPU Drano أداء sudo make install . يجب أن يقوم هذا بتثبيت المكتبات والثنائيات في الموقع الافتراضي (أو الموقع المحدد). إذا تم تثبيته محليًا ، فإن هذا الدليل يفترض أن Bash يمكنه العثور على الأمر في مساره.
ما سبق هو دليل البدء السريع. إذا لم تكن معتادًا على LLVM ، فقد تجد جميع التفاصيل للتثبيت على: http://llvm.org/docs/gettingstarted.html
يصف برنامج installnrun.sh البرنامج النصي عملية بناء برامج تشغيل NVIDIA ومجموعة الأدوات و SDK. تم التعليق على البرنامج النصي لتجنب خطر تجاوز سائقي NVIDIA الحاليين. لاحظ أننا نحتاج فقط إلى مجموعة الأدوات و SDK لتشغيل التحليل الثابت. نحتاج أيضًا إلى برامج تشغيل ووحدة معالجة الرسومات العاملة لتنفيذ التحليل الديناميكي وبرامج CUDA نفسها.
قم بتثبيت برامج تشغيل NVIDIA و CUDA Toolkit و SDK: يرجى الرجوع إلى دليل تثبيت NVIDIA للحصول على التعليمات.
باختصار ، إذا كنت تستخدم توزيعة Linux الحديثة والشعبية ، فيجب أن تكون قادرًا على استخدام أداة التنزيل التلقائي لتثبيت برامج التشغيل المطلوبة و SDK.
إذا كان لديك بالفعل برامج التشغيل المطلوبة وتثبيت SDK ، فيمكنك تخطي هذه الخطوة. ربما ليس من الجيد تجاوز برامج التشغيل الحالية لأن هذا قد يجعل نظامك غير صالح للاستخدام.
قد تتطلب G ++-Multilib لتثبيت المكتبات اللازمة التي تتطلبها clang .
هذه الخطوة اختيارية . يجب الآن تجميع برنامج CUDA بسيط مثل "Hello World" باستخدام clang أو clang++ :
clang -x cuda helloWorld.cu
يوضح خيار -x cuda بشكل صريح اللغة. يمكنك حذفه أيضًا وسيستنتج Clang هذا كبرنامج CUDA.
إشعار: قد لا يلزم أن يكون تثبيت Clang الخاص بك قادرًا على العثور على العديد من وظائف LLVM الداخلية ، إذا كان الأمر كذلك ، فقد تحتاج إلى تضمين -lcudart . قد تحتاج أيضًا إلى الإشارة إلى موقع cudart.so .
مثال:
clang -x cuda -L /usr/local/cuda/targets/x86_64-linux/lib/ -lcudart helloWorld.cu
قد يكون المسار إلى cudart.So مختلفًا اعتمادًا على نظامك.
يجب أن يكون LLVM قد أنشأ ملفًا مشتركًا .so لذا ، يسمى LLVMUncoalescedAnalysis.so ، تحت build/lib/ الدليل.
تقوم clang Complier LLVM بإنشاء جهاز منفصل (رمز Kernel GPU) ومضيف (رمز التشغيل على وحدة المعالجة المركزية) IR عند تجميع برامج CUDA. يحلل GPU Drano ملفات LLVM IR لرمز الجهاز.
على سبيل المثال ، دعنا نحلل رمز Rodinia kernel لقياس gaussian . نقوم بتغيير الدليل إلى rodinia_3.1/cuda/gaussian/ .
أولاً ، لدينا ملفات LLVM IR للرمز الذي يهتم به:
clang++ -S -g -emit-llvm gaussian.cu
لاحظ أننا نتجمع مع رمز التصحيح -g ، للحفاظ على معلومات التصحيح حول مواقع رمز المصدر في الأشعة تحت الحمراء التي تم إنشاؤها. يتم استخدام هذا لتوجيه مواقع التعليمات البرمجية المصدر مع وصول محتملة غير مصممة من LLVM IR.
يولد المجموعة ملفين:
gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll
gaussian.ll
يمكننا بعد ذلك تشغيل التحليل الثابت من خلال opt من LLVM من خلال تحديد المسار إلى GPU Drano الثنائية وتحديد -interproc-uncoalesced-analysis . هذا التمريرة هو تحليل interrocedural للكشف عن الوصول غير المصقول. إنه يبدأ بتحليل الوظيفة الأعلى الأكثر في الرسم البياني ، ثم يستمر في تحليل Callees في ترتيب طوبولوجي. أثناء تحليل كاليلي معين ، فإنه ينظر في انضمام سياقات المكالمات لجميع المتصلين. لتشغيل تحليل داخل المعاداة (يفترض أن جميع وسيطات الوظيفة الأولية مستقلة عن معرف الخيط) ، حدد -uncoalesced-analysis من غير المنقص ، بدلاً من -interproc-uncoalesced-analysis .
opt -load ../../../build/lib/LLVMUncoalescedAnalysis.so -instnamer -interproc-uncoalesced-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
إشعار opt يقرأ ملف الأشعة تحت الحمراء من الإدخال القياسي. يكتب opt إخراجها غير المهتمين إلى Standard Out ، لذلك نقوم بإعادة توجيهه إلى /dev/null GPU Drano المكتوب إلى خطأ قياسي يمكن إعادة توجيهه إلى ملف.
لتوليد نتائج تحليل مطول (LLVM IR مشروحة بمعلومات التحليل) ، قم بتشغيل opt باستخدام علامة -debug-only=uncoalesced-analysis .
يمكن استخدام الأمر التالي لتشغيل تحليل استقلال حجم الكتلة على البرنامج.
opt -load ../../../build/lib/LLVMBlockSizeInvarianceAnalysis.so - -instnamer -always-inline -interproc-bsize-invariance-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
تقارير النتائج التي تم إنشاؤها لتحليل الوصول غير المصحوبة عن جميع الأصول التي قد تكون غير متوفرة في كل من حبات GPU. على سبيل المثال ، فيما يلي نتائج تحليل gaussian.cu .
Analysis Results:
Function: _Z4Fan1PfS_ii
Uncoalesced accesses: #2
-- gaussian.cu:295:59
-- gaussian.cu:295:61
Analysis Results:
Function: _Z4Fan2PfS_S_iii
Uncoalesced accesses: #4
-- gaussian.cu:312:38
-- gaussian.cu:312:35
-- gaussian.cu:312:35
-- gaussian.cu:317:23
يشير كل عنصر نتيجة إلى وصول يحتمل أن يكون غير محتمل في الكود المصدري. على سبيل المثال ، الوصول إلى m_cuda في السطر 295 ، العمود 59 في gaussian.cu في Method Fan1() غير محدد.
وبالمثل ، تحدد النتائج التي تم إنشاؤها لتحليل الاستقلال بحجم الكتلة جميع النواة المستقلة بحجم الكتلة!
Rodinia هي مجموعة معاينة شائعة من برامج GPU التي تتكون من 22 برنامجًا من مجالات مختلفة. قمنا بتحليل الجناح ووجدنا 111 وصولًا حقيقيًا غير مصقول باستخدام تحليل ثابت. لإعادة إنتاج النتائج ، وهنا الخطوات المعنية:
تحديث تكوين CUDA و Drano في rodinia_3.1/common/make.config . تعيين CUDA_DIR و SDK_DIR مع مسارات أدوات NVIDIA و SDK. تحديث opt الاسم المستعار مع المسار إلى GPU Drano Binary LLVMUncoalescedAnalysis.so .
انتقل إلى دليل المعايير rodinia_3.1/cuda .
ترجمة المعايير:
sh compile.sh
sh run-analysis.sh
يولد تحليل كل معيار نتائج في مجلدها في ملفات السجل المسماة log_<filename> .
./summarize-results.sh
توفر Nvidia مجموعة من عينات CUDA التي يمكن استخدامها لتطبيقات مختلفة. قمنا بتحليل الجناح لتحديد النواة المستقلة بحجم الكتلة في العينات. لإعادة إنتاج النتائج ، الخطوات هي:
تحديث متغير HOME في NVIDIA_CUDA-8.0_Samples/common/drano.mk إلى دليل GPU drano الجذر.
تثبيت OpenGL (مطلوب لتجميع بعض المعايير). على Ubuntu ، يمكن استخدام الأمر التالي:
sudo apt-get install freeglut3-dev
انتقل إلى الدليل NVIDIA_CUDA-8.0_Samples
ترجمة المعايير:
sh compile.sh
sh run-analysis.sh
يولد تحليل كل معيار نتائج في مجلدها في ملفات السجل المسماة log_<filename> .
./summarize-bsize-independence.sh