قم بتنفيذ كود 32 بت C ++ إلى 64 بت - هل هو يستحق كل هذا العناء؟ لماذا ا؟

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

سؤال

أنا على علم ببعض المكاسب الواضحة للهندسة المعمارية X64 (عناوين RAM عالية العنوان، إلخ) ... ولكن:

  • ماذا لو لم يكن لدى برنامجي حقيقيا يجب تشغيله في وضع 64 بت الأصلي. يجب أن نفذها على أي حال؟
  • هل هناك مواعيد نهائية متوقعة لإنهاء دعم 32 بت؟
  • هل سيتم تشغيل طلبي بشكل أسرع / أفضل / أكثر أمانا مثل رمز X64 الأصلي؟
هل كانت مفيدة؟

المحلول

X86-64 هو القليل من الحالة الخاصة - بالنسبة للعديد من الهندسة (على سبيل المثال، SPARC)، فإن تجميع تطبيق لوضع 64 بت لا يعطيه أي فائدة ما لم يكن بإمكانه استخدام أكثر من 4 جيجابايت من الذاكرة. كل ما يفعله هو زيادة حجم الثنائية، والتي يمكن أن تجعل الكود في الواقع أبطأ إذا تأثرت على سلوك ذاكرة التخزين المؤقت.

ومع ذلك، يمنحك X86-64 أكثر من مجرد مساحة عنوان 64 بت وسجلات عدد صحيح 64 بت - كما أنها الزوجي عدد سجلات الغرض العام، الذي يمكن أن يؤديه في بنية نقص في التسجيل مثل X86 إلى زيادة كبيرة في الأداء، مع إعادة ترجمة.

كما يتيح للمترجم افتراض أن العديد من الإضافات، مثل SSE و SSE2 موجودة، والتي يمكن أن تحسن أيضا تحسين التعليمات البرمجية.

فائدة أخرى هي أن X86-64 يضيف عنوان الكمبيوتر الشخصي، والذي يمكن أن يبسط بشكل كبير رمز مستقل الموقف.

ومع ذلك، إذا لم يكن التطبيق حساسا للأداء، فلا شيء مهم حقا أيضا.

نصائح أخرى

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

قد يؤدي كل هذا إلى ظهور الأخطاء المخفية خلاف ذلك، مما يعني أنه يمكنك إصلاحها.

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

إليك ما يفعله 64 بت من أجلك:

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

لقد قمت باستكشفة عدد من تطبيقات C ++ وشهدت حوالي 10٪ من السرعة مع رمز 64 بت (نفس النظام، نفس الترجمة، وكان التغيير الوحيد وضع مترجم 64 بت من 32 بت)، ولكن معظم هذه التطبيقات كانت القيام بمبلغ عادل من 64 بت الرياضيات. ymmv.

أنا لا تقلق بشأن دعم 32 بت الخروج في أي وقت قريب.

(تم تحريره ليشمل الملاحظات من التعليقات - شكرا!)

على الرغم من أنه صحيح أن 32 بت سيكون حولها لفترة من الوقت أو آخر، فإن Windows Server 2008 R2 يتم تشغيله مع Sku 64 بت فقط. لن أفاجأ لمعرفة WOW64 كخيار تثبيت في وقت مبكر مثل Windows 8 حيث ترحيل المزيد من البرامج إلى 64 بت. WOW64 هو التثبيت والذاكرة والنفقات العامة للأداء. حدود ذاكرة الوصول العشوائي 3.5 جيجا بايت في النوافذ 32 بت مع زيادة كثافات الكبشاشات الكبيرة ستشجع هذه الهجرة. أفضل المزيد من ذاكرة الوصول العشوائي أكثر من وحدة المعالجة المركزية ...

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

IMO القضايا ذات الصلة بالذاكرة التخزين المؤقت الحالية التحسينات السيليكون في هذا المجال وستكون الأمثل 64 بت آخر.

  1. إذا لم يكن البرنامج الخاص بك لا حاجة إلى تشغيل أقل من 64 بت، فلماذا أنت؟ إذا لم تكن ملزمة بالذاكرة، ولن يكون لديك مجموعات بيانات ضخمة، فلا توجد نقطة. لا تحتوي مياتا الجديدة على إطارات أكبر، لأنها لا تحتاج إليها.
  2. دعم 32 بت (حتى لو كان فقط عن طريق مضاهاة) سوف يمتد الماضي الطويل عندما يتوقف برنامجك أن يكون مفيدا. ما زلنا محاكاة أتاري 2600s، أليس كذلك؟
  3. لا، في كل من أجل احتشالي، سيكون طلبك أبطأ في وضع 64 بت، ببساطة لأن أقل من ذلك سوف يصلح في ذاكرة التخزين المؤقت للمعالج. قد يكون أكثر أمانا قليلا، ولكن المبرمجون الجيدين لا يحتاجون إلى هذا العكاز :)

نشر ريك مارياني على لماذا مايكروسوفت ليس كذلك يقوم Porting Visual Studio إلى 64 بت حقا يلخصه Visual Studio: لماذا لا يوجد إصدار 64 بت؟ (بعد)

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

إذا لم يكن لديك أي حاجة حقيقية الآن، وعلى الأرجح أبدا، لن، لوضع 64 بت، يجب ألا تفعل التنقل.

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

لاحظ أن الحاجة قد تنشأ أيضا من التبعيات: إذا كان برنامجك عبارة عن مكتبة (مثل DLL)، فقد يكون من الضروري بمنفذه إلى وضع 64 بت فقط لأنه يحصل على بعض تطبيق المضيف.

بالنسبة لمستقبل متوقع، ستستمر تطبيقات 32 بت في الدعم.

ما لم يكن هناك سبب تجاري للذهاب إلى 64 بت، فلا توجد "حاجة حقيقية" لدعم 64 بت.

ومع ذلك، هناك بعض الأسباب الجيدة للذهاب إلى 64 بت في مرحلة ما، بصرف النظر عن كل تلك التي ذكرها الآخرون بالفعل.

  • إنها تزداد صعوبة في شراء أجهزة الكمبيوتر التي ليست 64 بت. على الرغم من أن تطبيقات 32 بت سوف تعمل في وضع التوافق لسنوات قادمة، فإن أي أجهزة كمبيوتر جديدة يتم بيعها اليوم أو في المستقبل من المرجح أن تكون 64 بت. إذا كان لدي نظام تشغيل لامع 64 بت لا أريد حقا تشغيل تطبيقات "Smelly Old Apps 32 بت" في وضع التوافق!

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

  • إذا كتبت التعليمات البرمجية الخاصة بك نظيفة، فستكون هناك احتمالية فقط لإعادة ترجمةها كجهاز إكس 64 بت وسيظل بشكل جيد، لذلك ليس هناك سبب حقيقي لعدم إعطائه.

  • في وقت سابق، تقوم بإنشاء نسخة أصلية 64 بت، والأسهل ستظل في العمل على العمل على 64 بت وأنت تضيف ميزات جديدة. هذه خطة أفضل بكثير من الاستمرار في التطوير في العصور المظلمة لسنوات "ن" أخرى ثم تحاول القفز في الضوء.

  • عندما تذهب إلى مقابلة عملك المقبلة، ستكون قادرا على القول أن لديك 64 بت Expeireence و 32-> تجربة Porting 32->.

أنت بالفعل على دراية بمزايا X64 (الأهم من ذلك أن حجم ذاكرة الوصول العشوائي المتزايدة) وأنت غير مهتم بأي، ثم لا تنفذ قابل للتنفيذ (EXE). عادة أدف يتحلل بعد منفذ، ويرجع ذلك أساسا إلى زيادة حجم وحدة X64 عبر X86: تتطلب جميع المؤشرات الآن الطول المزدوج، وهذا يتسرب في كل مكان، بما في ذلك حجم التعليمات البرمجية (بعض القفزات، مكالمات الوظيفة، VTables، الدعوات الافتراضية، الرموز العالمية إلخ إلخ). ليس تدهورا كبيرا، ولكن عادة ما تكون قابلة للقياس (انخفاض سرعة السرعة 3-5٪، يعتمد على العديد من العوامل).

DLLs تستحق التنفيذ لأنك تكسب "جمهور" جديد في تطبيقات X64 التي يمكن أن تستهلك DLL.

بعض OSS أو التكوينات غير قادر على تشغيل برامج 32 بت. الحد الأدنى لينكس دون 32 بت LIBC. مثبت على سبيل المثال. أيضا IIRC عادة ما تقوم بتجميع الدعم 32 بت من النواة.

إذا كانت هذه OSS أو التكوينات جزءا من قاعدة المستخدم المحتملة، فعندئذ نعم، يجب عليك منفذه.

إذا كنت بحاجة إلى مزيد من السرعة، فعليك أيضا منفذه (كما قال آخرون، X86-64 لديه المزيد من السجلات والتعليمات الرائعة التي تسرعها).

أو بالطبع، إذا كنت ترغب في mmap () أو خريطة ملف كبيرة أو الكثير من الذاكرة. ثم يساعد 64 بت.

على سبيل المثال، إذا كتبت رمز 32 بت (GNU C / ++) على النحو التالي تحرير: رمز التنسيق

struct packet {
    unsigned long name_id;
    unsigned short age;
};

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

انظر المزيد من الملاحظات حوالي 32/64 Porting في http://code.google.com/p/effocore/downloads/list., ، اسم المستند effocoreref.pdf.

من غير المرجح أن ترى أي فائدة إلا إذا كنت بحاجة إلى إجراءات أمنية شديدة أو كميات فاحشة من ذاكرة الوصول العشوائي.

في الأساس، من المرجح أن تعرف بشكل حدسي إذا كان الكود الخاص بك مرشح جيد للتنفيذ 64 بت.

فيما يتعلق بالمواعيد النهائية. لن أشعر بالقلق، وأشياء مثل 32bit ستكون حولها جيدة في حين أن المستخدمة ومستقبل متوقع في شكل آخر.

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

بالنسبة للرمز الخاص بك الذي يركض بشكل أسرع / أفضل، فهو يصل تماما إلى التعليمات البرمجية الخاصة بك والمتطلبات المفروضة عليها.

فيما يتعلق بقضايا الأداء، فإنه يعتمد على برنامجك في الواقع. إذا كان برنامجك مكثفا مؤشرا، فقد يتسبب التشغيل إلى 64 بت في خفض الأداء، نظرا لذاكرة التخزين المؤقت لوحدة المعالجة المركزية بنفس الحجم، فإن كل مؤشر 64 بت يشغل مساحة أكبر على ذاكرة التخزين المؤقت، كما تحتل التعيينات الظاهرية إلى الفيزيائية المزيد من مساحة TLB وبعد خلاف ذلك، إذا كان البرنامج ليس مكثفا مؤشرا، فسيستفيد أدائه من x64.

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

أود أن أوصي بتنفيذها إلى 64 بت فقط حتى تقوم بتشغيل "أصلي" (أيضا، أستخدم OpenBSD. في ميناء AMD64 الخاص بهم، فإنها لا تقدم أي دعم مضاهاة 32 بت، يجب أن يكون كل شيء 64 بت)

أيضا، stdint.h هو أفضل صديق! عن طريق Porting طلبك، يجب أن تتعلم كيفية الكود المحدد. مما سيجعل التعليمات البرمجية الخاصة بك الحق عندما يكون لدينا معالجات 128 بت أيضا (في غضون عدة عقود نأمل)

لقد قمت بتنقل 2 أو 3 أشياء إلى 64 بت وتطوير الآن لكلا (وهو أمر سهل للغاية إذا كنت تستخدم Stdint.h) وعلى أول مشروع على مشروعي إلى 64 بت تسبب مثل الحشرات 2 أو 3 لإظهارها، لكن ذلك كان هو - هي. معظمها كان إعادة ترجمة بسيطة والآن لا تقلق بشأن الاختلافات بين 32 و 64 بت عند إجراء رمز جديد لأنني مجرد رمز تلقائيا. (باستخدام intptr_t و size_t ومثل هذا)

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

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

سيتم تشغيل 64 بت أسرع بكثير، عندما تصبح المترجمات 64 بت ناضجة، ولكن عندما يحدث ذلك، لا أعرف

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