على 32 بت وحدة المعالجة المركزية ، هو 'صحيح' نوع أكثر كفاءة من 'قصيرة' نوع ؟

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

سؤال

على 32 بت وحدة المعالجة المركزية ، عدد صحيح هو 4 بايت و قصيرة عدد صحيح 2 بايت.إذا أنا أكتب C/C++ تطبيق يستخدم العديد من القيم الرقمية التي سوف تدخل دائما ضمن مجموعة من مسافة قصيرة عدد صحيح هو أكثر كفاءة في استخدام 4 بايت الأعداد الصحيحة أو 2 بايت الاعداد الصحيحه ؟

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

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

المحلول

نعم ، يجب عليك بالتأكيد استخدام 32 بت عدد صحيح 32 بت وحدة المعالجة المركزية ، وإلا فإنه قد ينتهي اخفاء قبالة المستخدمة بت (أي أنها سوف تفعل دائما الرياضيات في 32 بت, ثم تحويل الإجابة على 16 بت)

انها لن تفعل كل منهما 16 بت من العمليات في وقت واحد بالنسبة لك, ولكن إذا قمت بكتابة رمز نفسك و أنت متأكد أنها لن تجاوز, يمكنك أن تفعل ذلك بنفسك.

تحرير:وأود أن أضيف أنه أيضا يعتمد إلى حد ما على تعريف "كفاءة".في حين أنها سوف تكون قادرة على القيام 32 بت العمليات بسرعة أكبر ، يمكنك بالطبع استخدام ضعف الذاكرة.

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

نصائح أخرى

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

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

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

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

وحدة المعالجة المركزية 32 بت هي وحدة المعالجة المركزية التي تعمل عادة على 32 بت القيم داخليا، ولكن هذا لا يعني أنه أي أبطأ عند إجراء نفس العملية على قيمة 16/8 قليلا. إلى x86 على سبيل المثال، لا تزال متخلفة متوافقة حتى 8086، يمكن أن تعمل على أجزاء من السجل. وهذا يعني حتى لو سجل واسع 32 بت، فإنه يمكن أن تعمل فقط في أول 16 أو أول 8 بت من هذا السجل وسوف يكون هناك تباطؤ على الإطلاق. وقد تم حتى تبني هذا المفهوم x86_64، حيث السجلات هي 64 بت، ولكن لا يزال يمكن أن تعمل فقط في أول 32 أو 16 أو 8 بت.

وأيضا إلى x86 وحدات المعالجة المركزية دائما تحميل خط التخزين المؤقت كله من الذاكرة، إن لم يكن بالفعل في ذاكرة التخزين المؤقت، وخط التخزين المؤقت هو أكبر من 4 بايت على أي حال (32 وحدات المعالجة المركزية قليلا بدلا 8 أو 16 بايت)، وبالتالي تحميل 2 بايت من الذاكرة بنفس القدر أسرع وقت التحميل 4 بايت من الذاكرة. إذا تجهيز القيم العديد من الذاكرة، قد تكون 16 بت القيم في الواقع أسرع بكثير من 32 بت القيم، لأن هناك أقل نقل الذاكرة. إذا كان خط التخزين المؤقت هو 8 بايت، وهناك أربع قيم 16 بت لكل خط التخزين المؤقت، ولكن اثنين فقط 32 بت القيم، وبالتالي عند استخدام 16 [إينتس] قليلا لديك الوصول إلى الذاكرة واحدة كل أربع قيم، وذلك باستخدام 32 [إينتس] قليلا لديك واحدة كل قيمتين ، مما أدى إلى ضعف عدد تحويلات لتجهيز مجموعة كثافة العمليات الكبيرة.

وحدات المعالجة المركزية الأخرى، مثل PPC على سبيل المثال، لا يمكن معالجة فقط جزء من السجل، ومعالجة دائما السجل الكامل. بعد وعادة ما يكون هذه وحدات المعالجة المركزية عمليات الحمل الخاصة التي تسمح لهم، على سبيل المثال تحميل قيمة 16 بت من الذاكرة، وتوسيعه إلى 32 بت و الكتابة إلى السجل. في وقت لاحق لديهم عملية تخزين خاصة أن يأخذ القيمة من السجل وفقط يخزن 16 بت الماضي إلى الذاكرة، كلا العملية تحتاج دورة CPU واحدة فقط، تماما مثل 32 بت تحميل / مخزن يحتاج، لذلك ليس هناك فرق السرعة سواء. ومنذ PPC يمكن أن تؤدي فقط العمليات الحسابية على سجلات (على عكس إلى x86، والتي يمكن أن تعمل أيضا على الذاكرة مباشرة)، وهذا الإجراء تحميل / مخزن يحدث على أي حال ما إذا كنت تستخدم 32 بت أو 16 [إينتس] [إينتس] قليلا.

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

وحتى إذا كنت تتوقع كقاعدة عامة هنا، أنا يجب أن يخيب لك. لا يمكن للمرء أن يقول على وجه اليقين أن 16 عملية قليلا تتساوى بسرعة لعمليات 32 بت، ولا يمكن لأحد أن يقول على وجه اليقين أن 32 عمليات قليلا ستكون دائما أسرع. ويتوقف أيضا بالضبط ما يقوم به التعليمات البرمجية الخاصة بك مع هذه الأرقام وكيف يفعل ذلك. رأيت المقاييس حيث كانت 32 عمليات قليلا أسرع على بعض وحدات المعالجة المركزية 32 بت من نفس القانون مع 16 عملية قليلا، ولكن كما رأيت بالفعل عكس ذلك يجري الحقيقية. حتى التحول من مترجم 12:59 آخر أو ترقية الإصدار المترجم الخاص بك قد تتحول بالفعل كل شيء حولها مرة أخرى. ويمكنني أن أقول فقط ما يلي: كل من يدعي أن العمل مع شورت أبطأ بكثير من العمل مع [إينتس]، يجب إرضاء توفير الشفرة المصدرية عينة لهذا الطلب، واسم وحدة المعالجة المركزية ومترجم استخدمها للاختبار، حيث لم يسبق لي أن شهدت شيئا من هذا القبيل في حول مدى السنوات ال 10 الماضية. قد يكون هناك بعض الحالات، حيث عمل مع [إينتس] هو مايويكون أسرع 1-5٪، ولكن أي شيء أقل من 10٪ ليس "كبير" والسؤال هو، هل يستحق أن تضيع وضعف الذاكرة في بعض الحالات فقط لأنها قد تشتري لك أداء 2٪؟ أنا لا أعتقد ذلك.

وهذا يعتمد. إذا كنت CPU ملزمة، و32 عمليات بت على وحدة المعالجة المركزية 32 بت يكون أسرع من 16 بت. إذا كنت الذاكرة ملزمة (على وجه التحديد إذا كان لديك الكثير من إخفاقات التخزين المؤقت L2)، ثم استخدم أصغر البيانات التي يمكن أن يضغط فيها.

ويمكنك معرفة أي واحد كنت تستخدم ملفات التعريف التي من شأنها قياس كل وحدة المعالجة المركزية وL2 يفتقد مثل <وأ href = "http://www.intel.com/cd/software/products/asmo-na/eng/ vtune / 239144.htm "يختلط =" نوفولو noreferrer "> VTune إنتل . سيتم تشغيل التطبيق 2 مرات مع نفس الحمل، وسوف دمج تشغيل 2 في عرض واحدة من النقاط الساخنة في التطبيق الخاص بك، ويمكنك ان ترى في كل سطر من التعليمات البرمجية كيف أنفقت العديد من الدورات في هذا الخط. إذا كان في خط مكلفة من التعليمات البرمجية، ترى 0 يفتقد ذاكرة التخزين المؤقت، كنت CPU ملزمة. إذا كنت ترى طن من يخطئ، وكنت ملزمة الذاكرة.

ولا يستمع إلى نصيحة، انها محاولة.

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

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

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

وعندما تقول 32BIT و، سوف أفترض تقصد إلى x86. 16-بت الحساب بطيء جدا: حجم المعامل بادئة يجعل فك <م> حقا بطيئة. حتى لا تجعل المتغيرات درجة الحرارة الخاصة بك كثافة قصيرة أو int16_t.

ولكن، إلى x86 ويمكن تحميل بكفاءة 16 و 8 صحيحة قليلا إلى 32 أو 64 بت السجلات. (/ movsx movzx: الصفر وتوقيع التمديد). لذلك لا تتردد في استخدام كثافة العمليات قصيرة للصفائف ومجالات البنية، ولكن تأكد من استخدام كثافة أو طويلة للمتغيرات درجة الحرارة الخاصة بك.

<اقتباس فقرة>   

ولكن، إذا أنا مضيفا معا عددين قصيرة، سوف حزمة وحدة المعالجة المركزية كل القيم في مسار واحد في نفس الوقت (وبالتالي تمتد عرض النطاق الترددي 4 بايت من الحافلة)؟

وهذا هو هراء. تعليمات تحميل / مخزن تتفاعل مع مخبأ L1، والعامل المحدد هو عدد من التقاط. عرض غير ذي صلة. مثلا على المعالج Core2: 1 تحميل و1 مخزن لكل دورة، بغض النظر عن العرض. مخبأ L1 لديه مسار 128 أو 256bit إلى مخبأ L2.

إذا الأحمال هي عنق الزجاجة الخاصة بك، وتحميل واسعة واحد الذي انفصل مع التحولات أو أقنعة بعد التحميل يمكن أن تساعد. أو استخدام SIMD لمعالجة البيانات بالتوازي دون تفريغ بعد التحميل في نفس الوقت.

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