سؤال

لقد قرأت دليل البرمجة لـ CUDA و OpenCl ، ولا يمكنني معرفة ما هو الصراع المصرفي. إنهم مجرد نوع من الغوص في كيفية حل المشكلة دون توضيح الموضوع نفسه. هل يمكن لأي شخص مساعدتي في فهمه؟ ليس لدي أي تفضيل إذا كانت المساعدة في سياق CUDA/OPENCL أو مجرد تعارضات مصرفية بشكل عام في علوم الكمبيوتر.

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

المحلول

بالنسبة إلى NVIDIA (و AMD لهذه المسألة) ، تنقسم GPUs الذاكرة المحلية إلى ضفاف الذاكرة. لا يمكن لكل بنك معالجة مجموعة بيانات واحدة إلا في وقت واحد ، لذلك إذا حاول نصف GARP تحميل/تخزين البيانات من/إلى نفس البنك ، فيجب أن يتم الوصول إلى تسلسل الوصول (هذا تعارض بنكي). بالنسبة إلى GPUS GPUs ، يوجد 16 بنكًا (32 بنكًا لفيرمي) ، 16 أو 32 بنكًا لـ AMD GPU (57xx أو أعلى: 32 ، كل شيء أدناه: 16)) ، متشابكة مع حبيبة تبلغ 32 بت (لذلك البايت 0-3 البنك 1 ، 4-7 في البنك 2 ، ... ، 64-69 في البنك 1 وما إلى ذلك). للحصول على تصور أفضل ، يبدو الأمر كذلك:

Bank    |      1      |      2      |      3      |...
Address |  0  1  2  3 |  4  5  6  7 |  8  9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...

لذلك إذا وصل كل مؤشر ترابط في Halfwarp إلى قيم 32 بت متتالية ، فلا توجد تعارضات مصرفية. يتم بث استثناء من هذه القاعدة (يجب أن يصل كل مؤشر ترابط إلى بنكه الخاص): إذا تصل جميع مؤشرات الترابط إلى نفس العنوان ، فسيتم قراءة القيمة مرة واحدة فقط وتم بثها إلى جميع مؤشرات الترابط نفس العنوان ، يمكن لـ IIRC Fermi و AMD GPUs القيام بذلك لأي عدد من مؤشرات الترابط التي تصل إلى نفس القيمة).

نصائح أخرى

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

بالكلمات البسيطة ، يعد تعارض البنك حالة عندما يفشل أي نمط وصول للذاكرة في توزيع IO عبر البنوك المتوفرة في نظام الذاكرة. الأمثلة التالية توضح المفهوم:-

دعنا نفترض أن لدينا مجموعة من الأبعاد 512x512 من الأعداد الصحيحة ونظامنا DRAM أو الذاكرة لدينا 512 بنك فيه. بشكل افتراضي ، سيتم تخطيط بيانات الصفيف بطريقة تنتقل ARR [0] [0] إلى Bank 0 ، ARR [0] [1] إلى البنك 1 ، ARR [0] [2] إلى البنك 2 .... ARR [0] [511] يذهب إلى البنك 511. لتعميم ARR [X] [Y] يحتل رقم البنك Y. الآن بعض التعليمات البرمجية (كما هو موضح أدناه) تبدأ في الوصول إلى البيانات بطريقة أزياء رئيسية IE. تغيير x مع الحفاظ على ثابت y ، ثم النتيجة النهائية هي أن جميع الوصول إلى الذاكرة على التوالي سوف يضرب نفس البنك-وبالتالي تعارض البنك.

int arr[512][512];
  for ( j = 0; j < 512; j++ ) // outer loop
    for ( i = 0; i < 512; i++ ) // inner loop
       arr[i][j] = 2 * arr[i][j]; // column major processing

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

(صراع بنك كودا) آمل أن يساعد هذا .. هذا شرح جيد جدًا ...

http://www.youtube.com/watch؟v=czgm3debple

http://en.wikipedia.org/wiki/memory_bank
وhttp://mprc.pku.cn/mentors/training/iscareading/1989/p380-weiss/p380-weiss.pdf

من هذه الصفحة ، يمكنك العثور على التفاصيل حول Memory Bank. لكنه يختلف قليلاً عما قاله @grizzly. في هذه الصفحة ، البنك مثل هذا

البنك 1 2 3

العنوان | 0 ، 3 ، 6 ... | | 1 ، 4 ، 7 ... | | 2 ، 5،8 ... |

أتمنى أن يساعد هذا

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