توسيع نطاق التطبيقات متعددة الخيوط على الأجهزة متعددة النواة

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

سؤال

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

ما هي الموارد التي يوصي بها الناس؟

لقد وجدت حتى الآن عمود سوتر د.دوبس لتكون بداية جيدة.لقد حصلت للتو على فن برمجة المعالجات المتعددة وكتاب أورايلي عن كتل بناء Intel Threading

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

المحلول

هناك كتابان آخران سيكونان مفيدًا:

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

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

نصائح أخرى

قد ترغب في التحقق من ذلك أدوات أداء جوجل.لقد أصدروا نسختهم من malloc التي يستخدمونها للتطبيقات متعددة الخيوط.ويتضمن أيضًا مجموعة رائعة من أدوات ملفات التعريف.

جيفري ريختر مهتم بالخيوط كثيرًا.لديه بضعة فصول حول الخيوط في كتبه وراجع مدونته:

http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx.

كما يقول مونتي بايثون "والآن لشيء مختلف تمامًا" - يمكنك تجربة لغة/بيئة لا تستخدم سلاسل المحادثات، بل العمليات والرسائل (لا توجد حالة مشتركة).أحد أكثر الكتب نضجًا هو إرلانج (وهذا الكتاب الممتاز والممتع: http://www.pragprog.com/titles/jaerlang/programming-erlang).قد لا تكون ذات صلة تمامًا بظروفك، ولكن لا يزال بإمكانك تعلم الكثير من الأفكار التي قد تتمكن من تطبيقها في أدوات أخرى.

لبيئات أخرى:

.Net لديه F# (لتعلم البرمجة الوظيفية).JVM لديه Scala (التي لديها ممثلين، تشبه إلى حد كبير Erlang، وهي لغة هجينة وظيفية).يوجد أيضًا إطار عمل "fork join" من Doug Lea لـ Java والذي يقوم بالكثير من العمل الشاق من أجلك.

حصل المُخصص في FreeBSD مؤخرًا على تحديث لـ FreeBSD 7.الجديد يسمى jemaloc ويبدو أنه أكثر قابلية للتوسيع فيما يتعلق بخيوط متعددة.

لم تذكر النظام الأساسي الذي تستخدمه، لذا ربما يكون هذا المُخصص متاحًا لك.(أعتقد يستخدم فايرفوكس 3 jemalloc, ، حتى على النوافذ.لذلك يجب أن تكون المنافذ موجودة في مكان ما.)

نلقي نظرة على كنز إذا كنت تقوم بالكثير من تخصيص الذاكرة.

لفة بنفسك قفل القائمة الحرة.يوجد هنا مورد جيد - إنه بلغة C# لكن الأفكار قابلة للنقل.بمجرد أن تعتاد على كيفية عملها، ستبدأ في رؤية أماكن أخرى حيث يمكن استخدامها وليس فقط في القوائم.

سأضطر إلى التحقق من Hoard وGoogle Perftools وjemalloc في وقت ما.في الوقت الحالي، نستخدم Scalable_malloc من Intel Threading Building Blocks وهو يعمل بشكل جيد بما فيه الكفاية.

للأفضل أو للأسوأ، نحن نستخدم C++ على نظام التشغيل Windows، على الرغم من أن الكثير من التعليمات البرمجية الخاصة بنا سيتم تجميعها مع gcc بشكل جيد.ما لم يكن هناك سبب مقنع للانتقال إلى ريدهات (توزيعة لينكس الرئيسية التي نستخدمها)، أشك في أن الأمر يستحق الصداع/المشاكل السياسية للانتقال.

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

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

أحتفظ بمدونة ارتباط متزامن قد تكون ذات أهمية مستمرة:

http://concurrency.tumblr.com

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