سؤال

أفترض أنني أركز على x86 ، لكنني مهتم بشكل عام بالانتقال من 32 إلى 64 بت.

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

لقد سمعت أيضًا أن وضع 32 بت على X86 يجب أن يطرد ذاكرة التخزين المؤقت عند تبديل السياق بسبب مسافات عنوان 4G المتداخلة المحتملة.

إذن ، ما هي الفوائد الحقيقية لـ 64 بت؟

وكمسألة تكميلية ، هل سيكون 128 بت أفضل؟

تعديل:

لقد كتبت للتو أول برنامج 32/64 بت. إنه يصنع قوائم/أشجار متصلة من 16 بايت (إصدار 32B) أو 32 بايت (إصدار 64B) وتفعل الكثير من الطباعة إلى Stderr - ليس برنامجًا مفيدًا حقًا ، وليس شيئًا نموذجيًا ، لكنه الأول.

الحجم: 81128 (32b) v 83672 (64b) - لذلك ليس هناك فرق كبير

السرعة: 17S (32B) V 24S (64b) - تشغيل على 32 بت OS (OS -X 10.5.8)

تحديث:

ألاحظ أنه يجري تطويره الهجين X32 ABI (الواجهة الثنائية للتطبيق) وهو 64B ولكنه يستخدم 32B مؤشرات. بالنسبة لبعض الاختبارات ، يؤدي ذلك إلى رمز أصغر وتنفيذ أسرع من 32B أو 64B.

https://sites.google.com/site/x32abi/

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

المحلول

ما لم تكن بحاجة إلى الوصول إلى مزيد من الذاكرة التي تتيح لك معالجة 32B ، فإن الفوائد ستكون صغيرة ، إن وجدت.

عند التشغيل على وحدة المعالجة المركزية 64B ، يمكنك الحصول على واجهة الذاكرة نفسها بغض النظر عما إذا كنت تقوم بتشغيل رمز 32B أو 64B (أنت تستخدم نفس ذاكرة التخزين المؤقت ونفس الحافلة).

على الرغم من أن هندسة X64 لديها عدد قليل من السجلات التي تتيح تحسينات أسهل ، إلا أن هذا غالبًا ما يتم تصديته بواسطة مؤشرات حقيقة أصبحت الآن أكبر ، واستخدام أي هياكل ذات مؤشرات تؤدي إلى ارتفاع حركة الذاكرة. أود أن أقدر الزيادة في استخدام الذاكرة الإجمالي لتطبيق 64B مقارنة مع واحد 32B لتكون حوالي 15-30 ٪.

نصائح أخرى

عادةً ما أرى تحسينًا للسرعة بنسبة 30 ٪ للرمز المكثف على حساب x86-64 مقارنة بـ X86. ويرجع ذلك على الأرجح إلى حقيقة أن لدينا سجلات للأغراض العامة 16 × 64 بت وسجلات SSE 16 × بدلاً من سجلات الأغراض العامة 8 × 32 بت و 8 × سجلات SSE. هذا هو مع برنامج التحويل البرمجي Intel ICC (11.1) على Linux X86-64 - قد تكون النتائج مع المترجمين الآخرين (مثل GCC) ، أو مع أنظمة التشغيل الأخرى (EG Windows) ، بالطبع بالطبع.

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

فيما يتعلق بالفوائد العملية لـ 64 بت ... والأكثر وضوحًا هو أنك تحصل على مساحة عنوان أكبر ، لذلك إذا كان MMAP ملفًا ، فيمكنك معالجة المزيد منها مرة واحدة (وتحميل ملفات أكبر في الذاكرة). فائدة أخرى هي أنه ، على افتراض أن المترجم يقوم بعمل جيد في التحسين ، يمكن موازاة العديد من عمليات الحساب الخاصة بك (على سبيل المثال ، وضع أزواج من 32 بت في سجلين وأداء إضافات في عملية إضافة واحدة) ، و Big. سيتم تشغيل حسابات الأرقام بسرعة أكبر. ومع ذلك ، لن يساعدك كل شيء 64 بت مقابل 32 بت في التعقيد المقارب على الإطلاق ، لذلك إذا كنت تتطلع إلى تحسين الكود الخاص بك ، فيجب أن تنظر إلى الخوارزميات بدلاً من العوامل الثابتة مثل هذا.

تعديل:
يرجى تجاهل بياني حول الإضافة الموازية. لا يتم تنفيذ هذا ببيان إضافة عادي ... كنت مرتبكًا مع بعض تعليمات ناقلات/SSE. فائدة أكثر دقة ، بصرف النظر عن مساحة العنوان الأكبر ، هي أن هناك سجلات أغراض عامة أكثر ، مما يعني أنه يمكن الحفاظ مكدس البرنامج (مما يعني عادة الخروج إلى ذاكرة التخزين المؤقت L1).

بالإضافة إلى وجود المزيد من السجلات ، 64 بت لديها SSE2 افتراضيا. هذا يعني أنه يمكنك بالفعل إجراء بعض الحسابات بالتوازي. كان لملحقات SSE الأشياء الجيدة الأخرى أيضًا. لكنني أعتقد أن الفائدة الرئيسية هي عدم الاضطرار إلى التحقق من وجود امتدادات. إذا كان X64 ، فإنه يحتوي على SSE2. ... إذا كانت ذاكرتي تخدمني بشكل صحيح.

هناك حاجة فقط إلى تبرير نقل التطبيق إلى 64 بت في تطبيقات مثل تطبيقات البيانات الكبيرة أو تطبيقات ERP مع 100s على الأقل من المستخدمين المتزامنين حيث سيتم تجاوز حد 2 جيجابايت بسرعة إلى حد ما عند ذاكرة التخزين المؤقت للتطبيقات لتحسين الأداء. هذه حالة بشكل خاص على نظام التشغيل Windows OS حيث لا يزال عدد صحيح وطويل 32 بت (لديهم متغير جديد _int64. المؤشرات فقط هي 64 بت. في الواقع ، يتم تحسين WOW64 بشكل كبير على نظام التشغيل Windows X64 بحيث يتم تشغيل 32 بتات مع ركلة جزاء منخفضة على 64 بت من النوافذ OS. تجربتي على Windows X64 هي إصدار تطبيق 32 بت تشغيل أسرع 10-15 ٪ من 64 بت لأنه في الحالة السابقة على الأقل لقواعد بيانات الذاكرة الملكية ، يمكنك استخدام حساب المؤشر للحفاظ على شجرة B (معظم المعالجات المكثفة من أنظمة قاعدة البيانات) . التطبيقات المكثفة للتركيب تتطلب العشرية الكبيرة لأعلى دقة لا توفرها مزدوجة على نظام التشغيل 32-64 بت. يمكن أن تستخدم هذه التطبيقات _int64 بشكل غير صحيح بدلاً من مضاهاة البرمجيات. بالطبع ستظهر قواعد البيانات الكبيرة القائمة على القرص أيضًا تحسناً أكثر من 32 بت ببساطة مستحقة لإمكانية استخدام الذاكرة الكبيرة لتخزين التخزين المؤقت لخطط الاستعلام وما إلى ذلك.

يتم نقل المزيد من البيانات بين وحدة المعالجة المركزية وذاكرة الوصول العشوائي لكل ذاكرة (64 بت بدلاً من 32) ، لذلك يمكن أن تكون البرامج 64 بت أسرع بشرط أن يتم كتابتها بحيث تستفيد من هذا بشكل صحيح.

في الحالة المحددة المتمثلة في X68 إلى X68_64 ، سيكون برنامج 64 بت بنفس الحجم ، إن لم يكن أصغر قليلاً ، يستخدم ذاكرة أكثر قليلاً ، ويتم تشغيله بشكل أسرع. في الغالب هذا لأن x86_64 ليس لديه فقط 64 بت سجل ، بل يحتوي أيضًا على ضعف عددهم. لا يوجد لدى X86 سجلات كافية لجعل اللغات المترجمة فعالة قدر الإمكان ، لذا فإن رمز X86 ينفق الكثير من الإرشادات وعرض النطاق الترددي للذاكرة بين السجلات والذاكرة. X86_64 لديه أقل بكثير من ذلك ، وبالتالي يستغرق مساحة أقل قليلاً ويعمل بشكل أسرع. تعتبر تعليمات المتجه النقطة العائمة والإرشاد البتات أيضًا أكثر كفاءة في x86_64.

بشكل عام ، على الرغم من ذلك ، فإن رمز 64 بت ليس بالضرورة أي أسرع ، وعادة ما يكون أكبر ، سواء لاستخدام الرمز والذاكرة في وقت التشغيل.

أي تطبيقات تتطلب استخدام وحدة المعالجة المركزية مثل الترميز وأداء العرض وتقديم الوسائط ، سواء كانت صوتية أو بصرية ، سوف تتطلب بالتأكيد (في هذه المرحلة) الاستفادة من استخدام 64 بت مقابل 32 بت بسبب قدرة وحدة المعالجة المركزية على التعامل مع الشد كمية البيانات التي يتم إلقاؤها في ذلك. إنها ليست مسألة مساحة العنوان بقدر ما هي الطريقة التي يتم بها التعامل مع البيانات. سيؤدي معالج 64 بت ، الذي تم إعطاؤه 64 بت ، أداءً أفضل ، خاصةً مع أشياء صعبة رياضيا مثل ترميز البيانات وبيانات VoIP - في الواقع ، يجب أن تستفيد أي نوع من تطبيقات "الرياضيات" باستخدام 64 بت وحدات المعالجة المركزية وأنظمة التشغيل. تثبت لي خطأ.

أنا أرمز محرك الشطرنج. استخرج أفضل حركة نقل باستخدام بحث الأشجار المستند إلى الحد الأدنى إلى العمق 9 (من موضع معين) ~ 17.0s على تكوين Win32 وبعد التبديل إلى X64 ، يستغرق الآن 10.3s. هذا هو 41 ٪ من التسارع!

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