لتحسين البرامج للأداء المتوازي على جميع الأجهزة ، يجب أن تقبل أنه في العديد من المنصات المشتركة ، تعتبر المعالجة المتعددة المتماثلة كذبة. غالبًا ما يكون لـ "CPUs" التي اكتشفها نظام التشغيل الوصول إلى الموارد المشتركة مثل ذاكرة التخزين المؤقت ، DRAM و I/O الأجهزة الطرفية ، وأحيانًا حتى مواصفات عدم المساواة (كما هو الحال في ARM Big.little و Apple MX و Intel Adler Lake) ، ويمكن تحقيق مكاسب أداء كبيرة عن طريق أخذ هذه الحقائق في الاعتبار في الكود.
هذا هو أحدث ربط الصدأ المحفوظة لـ HWLOC ، مكتبة C من MPI المفتوح للكشف عن الطوبولوجيا الهرمية للبنية الحديثة: عقد ذاكرة NUMA ، مآخذ ، مخزونات للبيانات المشتركة والتعليمات ، النوى ، الخيوط المتعددة المتزامنة ، وأكثر من ذلك. بالإضافة إلى ذلك ، يتيح لك HWLOC تثبيت مؤشرات الترابط إلى نوى محددة وذاكرة وحدة المعالجة المركزية لعقد محددة NUMA ، وهو شرط أساسي لأداء تحسينات برنامج علم الطوبولوجيا.
تعتمد hwlocality على بعض التعليمات البرمجية والتصميم مع المحاولات السابقة التي لم يتم صيانتها الآن لكتابة روابط Rust HWLOC في Ichbinjoe/HWLOC2-RS و Daschl/HWLOC-RS. ومع ذلك ، فإنه لا يهدف إلى توافق API معهم. في الواقع ، تم إجراء العديد من التغييرات فيما يتعلق بـ HWLOC2-RS بهدف تحسين بيئة العمل والأداء وإزالة السبل للسلوك غير المحدد مثل افتراض أن المؤشرات غير فائقة أو حقول نقابة صالحة عندما لا أحد يخبرك بأنهم سيكونون دائمًا.
hwlocality متوافق مع libhwloc v2.0 وبعد ذلك. يمكنك تثبيت نسخة مناسبة من libhwloc بطريقتين مختلفتين:
libhwloc حديثة بشكل معقول ، فيمكنك تثبيتها جنبًا إلى جنب مع حزمة التطوير المرتبطة (تسمى عادةً libhwloc-dev أو libhwloc-devel ). هذه هي الطريقة الموصى بها للقيام بالأشياء لأنها ستسرع إلى حد كبير من hwlocality الخاص بك (RE) ويسمح لك بسهولة الحفاظ على محدثة libhwloc مع بقية بيئة التطوير الخاصة بك.hwlocality تنزيل وبناء نسختها الخاصة من libhwloc . لاستخدام مثل هذا الإنشاء الداخلي ، يرجى تمكين ميزة البضائع vendored . بالإضافة إلى بيئة بناء C العمل ، ستحتاج إلى automake و libtool على الوحدات ، و cmake على Windows. ما لم تكن تستخدم إصدارًا مزخرفًا من HWLOC من Windows ، فستحتاج أيضًا إلى تثبيت pkg-config أو أحد استنساخه ( pkgconf ، pkgconfiglite ...) ، حيث يتم استخدامه للعثور على libhwloc وإعداد hwlocality للربط معها.
بشكل افتراضي ، يهدف التوافق مع جميع إصدارات HWLOC 2.x ، مما يعني ميزات من الإصدارات الأحدث في سلسلة 2.x (أو ، في المستقبل القريب ، التوافق مع التغيرات في سلسلة 3.x) غير مدعومة بشكل افتراضي.
يمكنك تمكينهم ، على حساب فقدان التوافق مع إصدارات HWLOC 2.x الأقدم ، من خلال تمكين ميزة الشحن التي تتوافق مع أدنى إصدار HWLOC الذي يجب أن تكون متوافقًا معه. راجع قسم [features] من CARGO'S CARGO.TOML لمزيد من المعلومات.
أولاً ، أضف hwlocality كاعتماد:
cargo add hwlocality ثم ، داخل الكود الخاص بك ، قم بإعداد Topology . هذه هي نقطة الدخول الرئيسية لمكتبة HWLOC ، والتي من خلالها يمكنك الوصول إلى كل عملية تقريبًا تسمح بها HWLOC.
فيما يلي مثال على الاستخدام السريع الذي يمشي على الرغم من أن طوبولوجيا الأجهزة المكتشفة وطباعة وصفًا قصيرًا لكل كائن CPU و Cache المعروف بـ HWLOC:
use hwlocality :: { object :: depth :: NormalDepth , Topology } ;
fn main ( ) -> eyre :: Result < ( ) > {
let topology = Topology :: new ( ) ? ;
for depth in NormalDepth :: iter_range ( NormalDepth :: MIN , topology . depth ( ) ) {
println ! ( "*** Objects at depth {depth}" ) ;
for ( idx , object ) in topology . objects_at_depth ( depth ) . enumerate ( ) {
println ! ( "{idx}: {object}" ) ;
}
}
Ok ( ( ) )
}الناتج المحتمل هو:
*** Objects at depth 0
0: Machine
*** Objects at depth 1
0: Package
*** Objects at depth 2
0: L3 (16MB)
*** Objects at depth 3
0: L2 (512KB)
1: L2 (512KB)
2: L2 (512KB)
3: L2 (512KB)
4: L2 (512KB)
5: L2 (512KB)
*** Objects at depth 4
0: L1d (32KB)
1: L1d (32KB)
2: L1d (32KB)
3: L1d (32KB)
4: L1d (32KB)
5: L1d (32KB)
*** Objects at depth 5
0: Core
1: Core
2: Core
3: Core
4: Core
5: Core
*** Objects at depth 6
0: PU
1: PU
2: PU
3: PU
4: PU
5: PU
6: PU
7: PU
8: PU
9: PU
10: PU
11: PU
المزيد من الأمثلة متوفرة في مستودع المصدر.
معظم الميزات من سلسلة HWLOC 2.X تتعرض الآن بواسطة HWLOCALITY. لكن بعض الميزات المتخصصة ، المرتبطة في الغالب بالتشغيل البيني مع واجهات برمجة التطبيقات الأخرى ، لم تستطع أن تجعلها لأسباب مختلفة. المشكلات المتعلقة بتسمية "تغطية API" تتبع الميزات غير المنفذة ، وهي مكان رائع للبحث عن مساهمات محتملة لهذه المكتبة إذا كان لديك وقت!
إذا كنت على دراية بالفعل بـ HWLOC C API ، فستكون سعيدًا أيضًا بمعرفة أن سمات #[doc(alias)] تستخدم على نطاق واسع بحيث يمكنك البحث في الوثائق عن كيانات API HWLOC مثل hwloc_bitmap_t و hwloc_set_cpubind أو hwloc_obj::arity
الاستثناءات الرئيسية لهذه القاعدة هي مفاهيم غير مطلوبة في الصدأ بسبب تحسينات بيئة العمل التي يسمح بها نظام نوع الصدأ. على سبيل المثال...
Drop قولHWLOC_MEMBIND_BYNODESET يتم استبدالها بعمليات عامة تقوم بالشيء الصحيح تلقائيًا. يستخدم هذا المشروع ترخيص MIT ، يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.