ما هي التقنيات القياسية المتوفرة لاستخدام الميزات الخاصة بوحدة المعالجة المركزية في مكتبات الارتباط الحيوي (DLL)؟

StackOverflow https://stackoverflow.com/questions/131128

  •  02-07-2019
  •  | 
  •  

سؤال

نسخة مختصرة:أتساءل عما إذا كان من الممكن ، وأفضل ما هو أفضل ، استخدام تعليمات محددة في وحدة المعالجة المركزية داخل DLL؟

نسخة أطول قليلا:عند تنزيل ملفات DLL (32 بت) من Microsoft، على سبيل المثال، يبدو أن حجمًا واحدًا يناسب جميع المعالجات.

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

هل كانت مفيدة؟

المحلول

لا أعرف أي شيء معيار تقنية ولكن إذا اضطررت إلى عمل شيء من هذا القبيل، فسأكتب بعض التعليمات البرمجية في وظيفة DllMain() لاكتشاف نوع وحدة المعالجة المركزية وملء جدول الانتقال بمؤشرات الوظائف إلى الإصدارات المحسنة لوحدة المعالجة المركزية لكل وظيفة.

يجب أيضًا أن تكون هناك دالة قاسم مشترك أدنى عندما يكون نوع وحدة المعالجة المركزية غير معروف.

يمكنك العثور على معلومات وحدة المعالجة المركزية الحالية في السجل هنا:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor

نصائح أخرى

من المتوقع أن يعمل ملف DLL على كل جهاز كمبيوتر يعمل عليه WIN32، لذا فأنت ملتزم بمجموعة تعليمات i386 بشكل عام.لا توجد طريقة رسمية لكشف الوظيفة/الكود لمجموعات تعليمات محددة.عليك أن تفعل ذلك باليد وبشفافية.

التقنية المستخدمة بشكل أساسي هي كما يلي:- تحديد ميزات وحدة المعالجة المركزية مثل MMX ، SSE في وقت التشغيل - إذا كانت موجودة ، استخدمها ، إذا لم يكن الأمر

نظرًا لأنه لا يمكنك السماح للمترجم الخاص بك بتحسين أي شيء آخر غير i386، فسيتعين عليك كتابة التعليمات البرمجية باستخدام مجموعات التعليمات المحددة في المجمع المضمن.لا أعرف ما إذا كانت هناك مجموعات أدوات بلغات أعلى لهذا الغرض.يعد تحديد ميزات وحدة المعالجة المركزية أمرًا مباشرًا، ولكن قد يلزم أيضًا إجراؤه في المجمع.

إحدى الطرق السهلة للحصول على تحسينات SSE/SSE2 هي مجرد استخدام /arch حجة لMSVC.لن أقلق بشأن التراجع - فلا يوجد سبب لدعم أي شيء أقل من ذلك إلا إذا كان لديك تطبيق متخصص جدًا.

http://msdn.microsoft.com/en-us/library/7t5yh4fd.aspx

أعتقد أن gcc/g++ لها إشارات مكافئة.

يمكن لـ ICC من Intel تجميع التعليمات البرمجية مرتين لبنيات مختلفة.بهذه الطريقة، يمكنك الحصول على كعكتك وتناولها.(حسنًا، ستحصل على كعكتين - سيكون ملف DLL الخاص بك أكبر).وحتى MSVC2005 يمكنه القيام بذلك في حالات محددة جدًا (على سبيل المثال.يمكن لـ memcpy () استخدام SSE4)

هناك طرق عديدة للتبديل بين الإصدارات المختلفة.يتم تحميل ملف DLL، لأن عملية التحميل تحتاج إلى وظائف منه.يتم تحويل أسماء الوظائف إلى عناوين.أحد الحلول هو السماح لهذا البحث بالاعتماد ليس فقط على اسم الوظيفة، ولكن أيضًا على ميزات المعالج.تستخدم طريقة أخرى حقيقة أن وظيفة الاسم للعنوان تستخدم جدول المؤشرات في خطوة مؤقتة؛يمكنك تبديل الجدول بأكمله.أو يمكن أن يكون لديك فرع داخل الوظائف الهامة؛لذلك يستدعي foo() foo__sse4 عندما يكون ذلك أسرع.

تستهدف ملفات DLL التي تقوم بتنزيلها من Microsoft بنية x86 العامة لسبب بسيط وهو أنها يجب أن تعمل عبر جميع الأجهزة المتعددة الموجودة.

حتى الإطار الزمني لـ Visual Studio 6.0 (لا أعرف ما إذا كان قد تغير) اعتادت Microsoft على تحسين ملفات DLL الخاصة بها من حيث الحجم بدلاً من السرعة.وذلك لأن تقليل الحجم الإجمالي لمكتبة الارتباط الحيوي (DLL) أعطى تعزيزًا أعلى للأداء مقارنة بأي تحسين آخر يمكن أن يقوم المترجم بإنشائه.وذلك لأن عمليات التسريع الناتجة عن التحسين الجزئي ستكون منخفضة بالتأكيد مقارنة بعمليات التسريع الناتجة عن عدم انتظار وحدة المعالجة المركزية للذاكرة.التحسينات الحقيقية في السرعة تأتي من تقليل الإدخال/الإخراج أو من تحسين الخوارزمية الأساسية.

فقط عدد قليل من الحلقات المهمة التي تعمل في قلب البرنامج يمكن أن تستفيد من التحسينات الدقيقة وذلك ببساطة بسبب العدد الهائل من المرات التي يتم استدعاؤها.قد يقع حوالي 5-10% فقط من التعليمات البرمجية الخاصة بك ضمن هذه الفئة.يمكنك أن تطمئن إلى أن مثل هذه الحلقات المهمة قد تم تحسينها بالفعل في المجمع من قبل مهندسي برامج Microsoft إلى مستوى ما ولن تترك الكثير ليجده المترجم.(أعلم أنه يتوقع الكثير ولكن أتمنى أن يفعلوا ذلك)

كما ترون، ستكون هناك عيوب فقط من كود DLL المتزايد الذي يتضمن إصدارات إضافية من التعليمات البرمجية التي تم ضبطها لبنيات مختلفة عندما نادرًا ما يتم استخدام معظم هذا الرمز / لا يكون أبدًا جزءًا من التعليمات البرمجية الهامة التي تستهلك معظم دورات وحدة المعالجة المركزية الخاصة بك .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top