سؤال

قرأت في وثائق Visual C ++ أنها آمنة للحصول على مؤشرات ترابط متعددة للقراءة من نفس الكائن.

سؤالي هو: كيف يعالج وحدة المعالجة المركزية X86-64 مع النوى المتعددة هذا؟

قل لديك كتلة 1 ميغابايت من الذاكرة. هي خيوط مختلفة قادرة حرفيا على قراءة نفس البيانات بالضبط في نفس الوقت أو القيام النوى قراءة كلمة واحدة في وقت واحد يسمح بنبرة واحدة فقط لقراءة كلمة معينة في وقت واحد؟

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

المحلول

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

حول حجم الذاكرة يقرأ جوهر في المرة الواحدة، وهذا عادة ما يستحق السجل، 32 بت من وحدة المعالجة المركزية 32bit، 64 بت من وحدة المعالجة المركزية 64 بت وهلم جرا. تم التنقل حتى DWORD حسب DWORD (انظر إلى MEMCPY على سبيل المثال).

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

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

نصائح أخرى

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

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

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

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

بعض الروابط المفيدة:

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