الأمثل تماما memcpy / memmove لكور 2 أو بنية الأساسية i7؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

والحد الأقصى النظري من عرض النطاق الترددي الذاكرة لمعالج كور 2 مع ذاكرة DDR3 مزدوجة القناة أمر مثير للإعجاب: وفقا لل ويكيبيديا المقالة على الهندسة المعمارية، و10+ أو 20+ غيغابايت في الثانية الواحدة. ومع ذلك، والأوراق المالية memcpy () المكالمات لا تحقيق ذلك. (3 جيجابايت / ثانية هو أعلى رأيت في هذه الأنظمة.) المحتمل، ويرجع ذلك إلى شرط OS البائع الذي memcpy () ضبطها لكل خط المعالج على أساس الخصائص المعالج، لذلك التنفيذ الأسهم memcpy () يجب أن تكون معقولة على عدد كبير من العلامات التجارية وخطوط.

وسؤالي: هل هناك متاحة بحرية، الإصدار ضبطها للغاية لكور 2 أو المعالجات الأساسية i7 التي يمكن استخدامها في برنامج C؟ أنا متأكد من أنني لست الشخص الوحيد في حاجة واحدة، وأنه سيكون مضيعة كبيرة من الجهد للجميع للالصغرى تحسين memcpy الخاصة بها ().

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

المحلول

إذا قمت بتحديد / ARCH: SSE2 لMSVC يجب أن توفر لك مع memcpy ضبطها (على الأقل، والألغام لا)

وإذا تعذر ذلك، استخدم الانحياز SSE تحميل / مخزن intrinsics نفسك لنسخ الذاكرة في أجزاء كبيرة، ويعمل جهاز داف كلمة يقرأ عند الضرورة للتعامل مع الرأس والذيل من البيانات للحصول عليه إلى حدود الانحياز. سوف تحتاج إلى استخدام intrinsics إدارة التخزين المؤقت وكذلك للحصول على الأداء الجيد.

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

نصائح أخرى

عند قياس عرض النطاق الترددي لم تأخذ بعين الاعتبار memcpy كان كل من القراءة والكتابة، لذلك 3 جيجابايت / ثانية من ذاكرة نسخ هو في الواقع 6 جيجابايت / ثانية من عرض النطاق الترددي؟

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

وmemcpy / memmove هي intrinsics مترجم ووعادة ما تكون inlined إلى movsd مندوب (أو تعليمات SSE المناسبة إذا المترجم الخاص بك يمكن أن تستهدف ذلك). قد يكون من المستحيل لتحسين codegen على هذا، لأن وحدة المعالجة المركزية الحديثة والتعامل مع تعليمات مندوب مثل هذا جدا، جيد جدا.

هل يمكن الكتابة الخاصة بك. حاول استخدام إنتل تحسين مترجم لمباشرة استهداف العمارة؟

وإنتل أيضا إنتاج ما يسمى VTune (مترجم ولغة مستقلة) لتحسين التطبيقات.

وإليك <لأ href = "http://software.intel.com/en-us/articles/achieving-performance-an-approach-to-optimizing-a-game-engine/" يختلط = "نوفولو noreferrer "> المقالة على تحسين محرك اللعبة.

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