سؤال

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

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

المحلول

الجواب القصير هو "استخدام أيهما الدقة المطلوبة للحصول على نتائج مقبولة."

واحد الخاص بك ضمان أن العمليات التي تجرى على النقطة العائمة البيانات تتم على الأقل في أعلى مستوى من الدقة الأعضاء من التعبير.حتى ضرب اثنين تطفو's هو القيام به على الأقل دقة تطفو, و ضرب تطفو و مزدوج سوف يتم على الأقل الدقة المزدوجة.القياسية الأمريكية أن "النقطة العائمة] العمليات يمكن القيام بها مع دقة أعلى من نتيجة نوع من العملية."

بالنظر إلى أن JIT على .صافي محاولات ترك عملية نقطة عائمة في الدقة المطلوبة ، يمكننا أن نلقي نظرة على وثائق من Intel لتسريع عملياتها.على منصة إنتل الخاص بك عملية نقطة عائمة قد تكون متوسطة الدقة من 80 بت و تحويلها إلى أسفل إلى الدقة المطلوبة.

من إنتل دليل C++ عمليات النقطة العائمة1 (آسف فقط شجرة ميتة) ، نذكر:

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

هذه النقطة الأخيرة مهمة مثل يمكنك إبطاء نفسك إلى أسفل مع لزوم يلقي من تعويم مزدوجة, مما يؤدي JIT أن التعليمات البرمجية التي تطلب إلى x87 أن يلقي بعيدا عن 80 بت المتوسطة تنسيق بين عمليات!

1.نعم مكتوب C++, ولكن C# القياسية بالإضافة إلى معرفة CLR يتيح لنا أن نعرف معلومات عن C++ يجب أن تنطبق في هذه الحالة.

نصائح أخرى

لقد قرأت للتو "مايكروسوفت .الإطار الصافي-تطبيق مؤسسة التنمية 2" عن الامتحان MCTS 70-536 وهناك ملاحظة في الصفحة 4 (الفصل 1):

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

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

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

وحدات المعالجة المركزية إنتل الحالية أداء جميع العمليات النقطة العائمة في سجلات واسعة 80 بت وبالتالي فإن سرعة الفعلية للحساب لا ينبغي أن تختلف بين يطفو والزوجي.

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

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

وأنا أكتب التتبع راي، واستبدال العوامات مع الزوجي لصفي اللون يعطيني تسريع 5٪. استبدال ناقلات يطفو مع الزوجي هو 5٪ أخرى أسرع! جميلة باردة:)

وهذا هو مع كور i7 920

ومع 387 FPU الحساب، وتعويم أسرع فقط من ضعف لبعض عمليات متكررة طويلة مثل الأسرى، تسجيل، الخ (وإلا إذا كان المترجم يضع الكلمة التحكم FPU بشكل مناسب).

ومع معبأة الحساب SSE، فإنه يجعل فرقا كبيرا بالرغم من ذلك.

ماتيس،

وأنت مخطئ. 32-بت أكثر كفاءة من 16 بت - في المعالجات الحديثة ... ربما لا ذاكرة الحكيمة، ولكن في فعالية 32 بت هو الطريق للذهاب

هل حقا يجب تحديث أستاذك إلى شيء أكثر من ذلك "ما يصل إلى تاريخ". ؛)

وعلى أي حال، للإجابة على السؤال. تطفو وضعف لديها بالضبط نفس الأداء، على الأقل في بلدي إنتل i7 من 870 (كما في نظرية).

وهنا القياسات لي:

و(لقد تقدمت "الخوارزمية" التي كررت لل10000000 مرات، ثم كرر ذلك لمدة 300 مرات، ومن الذي أدليت به في المتوسط).

double
-----------------------------
1 core  = 990 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

float
-----------------------------
1 core  = 992 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

وهذا يدل على أن العوامات أسرع قليلا من الضعف: http://www.herongyang.com /cs_b/performance.html

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

والعربات يجب أن تكون أسرع على نظام 32 بت، ولكن الشخصية رمز للتأكد من أنك تحسين الشيء الصحيح.

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

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

وهذا هو على بلدي i7 من 920، بتشغيل نظام تشغيل 64 بت.

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