"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تحديد ما إذا كان Hyper-Threading ممكّنًا على أنظمة التشغيل Windows وMac وLinux؟

كيفية تحديد ما إذا كان Hyper-Threading ممكّنًا على أنظمة التشغيل Windows وMac وLinux؟

تم النشر بتاريخ 2024-11-23
تصفح:801

How to Determine if Hyper-Threading is Enabled on Windows, Mac, and Linux?

اكتشاف وجود خيوط المعالجة المتعددة الممكنة

في التطبيقات متعددة الخيوط، يضمن استخدام مؤشر ترابط واحد لكل نواة معالج فعلي الأداء الأمثل. لتحديد عدد الخيوط بشكل دقيق، من الضروري التمييز بين النوى المادية والمتعددة الخيوط. فيما يلي كيفية اكتشاف دعم الترابط التشعبي وحالة التنشيط الخاصة به على أنظمة التشغيل Windows وMac وLinux:

تعليمات CPUID

باستخدام تعليمات CPUID، يمكننا جمع معلومات حول قدرات المعالج وتكوينه. تم توضيح العملية خطوة بخطوة أدناه:

  1. اكتشاف البائع : تنفيذ وظيفة CPUID 0 لتحديد بائع وحدة المعالجة المركزية (على سبيل المثال، Intel أو AMD).
  2. فحص بت الخيوط المفرطة: قم بتنفيذ وظيفة CPUID 1 وتحقق من البت 28 في سجل EDX. يشير هذا البت إلى دعم الترابط الفائق.
  3. العدد الأساسي المنطقي: استرداد عدد النوى المنطقية لكل وحدة معالجة مركزية من البتات [23:16] من EBX في وظيفة CPUID 1.
  4. العدد الأساسي المادي :

    • إنتل وحدات المعالجة المركزية : إذا كان البائع هو "GenuineIntel"، فاستخدم وظيفة CPUID 4 للحصول على عدد النوى الفعلية بالإضافة إلى واحد عن طريق استخراج البتات [31:26] من سجل EAX.
    • وحدات المعالجة المركزية AMD: إذا كان البائع هو "AuthenticAMD"، فقم بتنفيذ وظيفة CPUID 0x80000008 واشتق عدد النوى الفعلية بالإضافة إلى واحد عن طريق أخذ بتات [7:0] من سجل ECX.
  5. التنفيذ

إليك برنامج C الذي ينفذ هذه الطريقة:

#تتضمن #تشمل void cpuID(unsigned i, unsigned regs[4]); إنت الرئيسي () { التسجيلات غير الموقعة[4]؛ // احصل على معلومات CPUID cpuID(0x00, regs); cpuID(0x01, regs); // تحديد البائع بائع شار[12]; ((unsigned *)vendor)[0] = regs[1]; ((unsigned *)vendor)[1] = regs[3]; ((unsigned *)vendor)[2] = regs[2]; std::string cpuVendor = std::string(vendor, 12); // المتغيرات unsigned logicCores = (regs[1] >> 16) & 0xff; النوى غير الموقعة = logicCores؛ bool HyperThreads = false; // كشف خيوط المعالجة المفرطة إذا (cpuVendor == "GenuineIntel") { cpuID(0x04, regs); النوى = ((regs[0] >> 26) & 0x3f) 1; } else if (cpuVendor == "AuthenticAMD") { cpuID(0x80000008, regs); النوى = ((غير موقعة)(regs[2] & 0xff)) 1; } إذا (regs[3] & (1 #include #include void cpuID(unsigned i, unsigned regs[4]); int main() { unsigned regs[4]; // Get CPUID information cpuID(0x00, regs); cpuID(0x01, regs); // Determine vendor char vendor[12]; ((unsigned *)vendor)[0] = regs[1]; ((unsigned *)vendor)[1] = regs[3]; ((unsigned *)vendor)[2] = regs[2]; std::string cpuVendor = std::string(vendor, 12); // Variables unsigned logicalCores = (regs[1] >> 16) & 0xff; unsigned cores = logicalCores; bool hyperThreads = false; // Detect hyper-threading if (cpuVendor == "GenuineIntel") { cpuID(0x04, regs); cores = ((regs[0] >> 26) & 0x3f) 1; } else if (cpuVendor == "AuthenticAMD") { cpuID(0x80000008, regs); cores = ((unsigned)(regs[2] & 0xff)) 1; } if (regs[3] & (1

Intel Core 2 Duo E8400 (بدون خيوط متشعبة):

النوى المنطقية: 2 النوى: 2 خيوط متشعبة: false

Logical cores: 2
Cores: 2
Hyper-threading: false

النوى المنطقية: 8 النوى: 4 الخيوط المفرطة: صحيح

 Logical cores: 8
    Cores: 4
hyper-threads: true

النوى المنطقية: 12 النوى: 6 المواضيع المفرطة: صحيح

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3