Fdtd3d: أسئلة في الحوسبة المتوازية

تم إنشاؤها على ٨ يناير ٢٠٢٠  ·  9تعليقات  ·  مصدر: zer011b/fdtd3d

مرحبًا جليب ،

أنا Chengyi. شكرا لك على تطوير هذا المشروع الرائع. إنه مفيد حقًا لدراسة FDTD وتزامنه. لكنني واجهت بعض المشكلات في استخدام حوسبة MPI / GPU.

  1. المشكلة هي أنه عند استدعاء كود fdtd3d باستخدام الأمر التالي ،
    ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    حيث أنشأت "vacuum3D_test.txt" بناءً على "vacuum3D.txt" عن طريق إدخال الكود التالي
--use-cuda
--cuda-buffer-size 1
--cuda-gpus 0
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

سيعرض البرنامج فقط السجل "تحميل سطر الأوامر من الملف ./Examples/vacuum3D_test.txt
"واستمر في الانتظار حتى أقتله. أنا فقط أتساءل عما إذا كانت هناك بعض التكوينات التي لم أقم بضبطها بشكل صحيح؟
بالمناسبة ، هذه هي أعلام cmake الخاصة بي في حال احتجت إليها:
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCUDA_ARCH_SM_TYPE=sm_60 -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3

  1. أيضًا ، عندما قمت بمحاكاة "vacuum3D.txt" بواسطة MPI ، فإن قابلية التوسع التي قدمها fdtd3d ليست مثالية جدًا. على سبيل المثال ، حجم الشبكة هو 40 × 40 × 40 وهو ما يساوي 64000. ولدي شريحة واحدة بها 18 مركزًا. عندما تسير مع عملية واحدة ، ستكلف 67.74 ثانية وستكون حوالي 11.34 ثانية مع تمكين 8 معالجات. تبلغ السرعة حوالي 6. وعندما أقوم بتطبيق المزيد من المعالجات مثل 18 ، يكون تقليل الوقت ضئيلًا ، لنقل من 11.34 ثانية إلى 9.6 ثانية. هل هذا معقول؟ هل يمكنني أن أسأل عما إذا كانت هناك تكوينات محاكاة يمكنها ضبط أداء الحوسبة المتوازية؟

إذا كنت بحاجة إلى مزيد من تفاصيل المحاكاة ، فيرجى إبلاغي بذلك. شكرا جزيلا لك.

مع جزيل الشكر والتمنيات ،
Chengyi

Question

ال 9 كومينتر

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

نصيحة صغيرة: من الأسرع (من حيث التجميع والتنفيذ) تحديد -DSOLVER_DIM_MODES ، إذا كنت تعرف بالضبط الأوضاع التي ستستخدمها. بشكل افتراضي ، يتم تجميع جميع الأوضاع في نظام ثنائي ، مما يزيد بشكل كبير من وقت التجميع في حالة إنشاءات Cuda. في حالتك سيكون -DSOLVER_DIM_MODES=DIM3 كافيًا.

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

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

مع وضع كل هذا في الاعتبار ، لا تزال هناك أشياء يمكن تعديلها في fdtd3d.

  • بشكل افتراضي ، يتم توزيع محور Ox فقط بين العقد الحسابية ، ولكن يمكنك تغيير هذا باستخدام -DPARALLEL_BUFFER_DIMENSION=xyz ، والذي سيقسم الشبكة بين الأجزاء في جميع الأبعاد. تحقق من إخراج fdtd3d لأنه ينصح بالطوبولوجيا الافتراضية المثلى.
  • يمكن إعداد حجم المخزن المؤقت --buffer-size B ، وسيتم تنفيذ عملية المشاركة فقط لكل خطوات B . في هذه الحالة ، لا يمكن ضمان أن تكون الطوبولوجيا الافتراضية المثالية ، التي تنصح بها fdtd3d ، هي الأمثل. ولكن يمكنك تعيين الهيكل الافتراضي يدويًا باستخدام --manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Z .

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

شكرا لك على هذا الرد في الوقت المناسب.

  1. بالنسبة لحوسبة GPU الفردية ، قمت بإعادة تشكيل fdtd3d بالعلامات التالية

cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3 -DSOLVER_DIM_MODES=DIM3 -DPARALLEL_BUFFER_DIMENSION=x

وعملت في محطة العمل الخاصة بي. (راجع للشغل ، محطة العمل الخاصة بي بها أربعة Tesla P100s والتي يجب أن يكون القوس SM_60)

  1. عندما أريد تمكين الحوسبة متعددة وحدات المعالجة المركزية مع
    mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    و CUDA cmds
--use-cuda
--cuda-buffer-size 2
--buffer-size 2
--cuda-gpus 0,1
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4

حدث الخطأ كما هو موضح:

Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at /home/t00540502/fdtd3d/Source/Scheme/InternalScheme.inc.h:912
*** FAILED - ABORTING
-------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.

يبدو أن الخطوة الأولى كانت جيدة ولكن هناك خطأ ما في الوظيفة InternalSchemeKernelHelpers::calculateFieldStepIterationKernel للاتصال في الخطوة الثانية. أنا أتساءل لابد من وجود بعض الأخطاء التي ارتكبتها في استخدام MPI + CUDA. هل يمكنك أن تعلمني كيف أسميها بشكل صحيح؟
شكرا جزيلا.

الأفضل

ربما هناك خطأ ما في sm_60 القوس ، لم أختبره. القوس الافتراضي هو sm_20 ، لذا يجب أن يعمل على البطاقات الخاصة بك. ومع ذلك ، فقد رأيت أحيانًا illegal memory access عندما لا يتطابق قوس cuda مع قدرة حساب GPU.

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

ولكن عندما تكون الشبكات كبيرة جدًا ولا يمكن تحديد موقعها في ذاكرة عقدة حسابية واحدة ، فلا يوجد خيار سوى استخدام عقد حسابية متعددة ، يحتمل أن يكون لكل منها وحدة معالجة رسومات. في هذه الحالة ، سيتم تنفيذ مشاركة بيانات CPU-GPU و CPU-CPU لكل خطوات B ، افتراضيًا B=1 . هذا أبطأ بكثير من الحسابات العادية لجميع الخطوات الزمنية على وحدة معالجة رسومات واحدة.

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

solotcy كان هناك خطأ مع قوس غير محدد (انظر # 140). من فضلك ، تحقق مع sm_60 على ذلك PR.

Illegal memory access مرتبط بالوصول إلى cudaSolverSettings المتغير العام ، الموجود في ذاكرة الجهاز (انظر INTERNAL_SCHEME_BASE<Type, TCoord, layout_type>::calculateFieldStepIteration ):

if (SOLVER_SETTINGS.getDoUseTFSF ())

في 2 من 3 وحدات معالجة رسومات مع نفس إمكانية الحوسبة sm_35 ، والتي اختبرت fdtd3d عليها ، كل شيء يعمل بشكل جيد (جميع وحدات معالجة الرسومات نماذج مختلفة). ومع ذلك ، يصبح cudaSolverSettings لسبب ما NULL ، عند إدخال طريقة getDoUseTFSF (أي أن ptr هو NULL). لم أتمكن من فهم سبب حدوث ذلك ، ولكن مما وجدته قد يحدث بسبب عطل في الجهاز.

يبدو أنك تمكنت من تشغيل fdtd3d بنجاح على الأقل على واحدة من 4 وحدات معالجة رسومات. جرب وضع GPU فقط في كل وحدة معالجة رسومات على حدة. نظرًا لأن جميع وحدات معالجة الرسومات الأربعة لديك متطابقة تمامًا ، فلن يكون هناك اختلاف على الإطلاق في سلوك fdtd3d. هناك فرق ، ثم يصبح سبب حدوث عطل في الجهاز أكثر احتمالا.

شكرا جزيلا على الردود.

لقد راجعت PR # 140 وأعدت بناء fdtd3d بالعلامة -DCUDA_ARCH_SM_TYPE = تمت إضافة sm_60. لسوء الحظ ، تحدث نفس المشكلة.

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

Estimated current size: 1437644553 byte.
Setup blocks:
blockCount:
Coord (X : 1.000000, Y : 1.000000, Z : 1.000000).
blockSize:
Coord (X : 200.000000, Y : 200.000000, Z : 200.000000).
Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at ~/fdtd3d/Source/Scheme/InternalScheme.inc.h:912

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

شكرا لاختباراتك! تمكنت أخيرًا من معرفة السبب الأساسي لهذه المشكلة. PR # 141 يحل المشكلة. الآن يجب أن يعمل fdtd3d على جميع وحدات معالجة الرسومات الخاصة بك. يبدو أن وضع GPU متعدد يعمل أيضًا الآن.

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

لا تتردد في إعادة فتح هذه المشكلة إذا كان لديك المزيد من الأسئلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات