Чому мій паралельний вирішувач повільніше, ніж мій послідовний вирішувач?


14

Я бавився з PETSc і помітив, що коли я запускаю свою програму з більш ніж одним процесом через MPI, вона, здається, працює ще повільніше ! Як я можу перевірити, щоб побачити, що відбувається?


Не публікувати це як відповідь, тому що це справді "що", а не "як", але у мене були подібні проблеми в минулому, які були викликані захищеним мутексним розділом коду, до якого зверталися з декількох потоків. Іноді доводиться перевіряти, чи не фіксується загальний ресурс за кадром.
David Z

Відповіді:


13

Це може виникати з архітектурних факторів:

Якщо однакова пропускна здатність пам'яті доступна для одного або декількох процесів, ви майже не побачите прискорення, оскільки SpMV та пов'язані з ними операції лінійної алгебри обмежені пропускною здатністю пам'яті.

Можливо, так і трапляється, що накладні комунікації перевантажують місцеві обчислення. Наприклад, у лінійних ітеративних методах ми рекомендуємо мати не менше 10 000 невідомих за процес.

або числові фактори:

Паралельні кондиціонери часто слабкіші за їх серійні аналоги. Наприклад, блок Jacobi стає слабкішим, чим більше блоків ви використовуєте. Таким чином, потрібно враховувати додатковий час, витрачений на додаткові лінійні ітерації. Нелінійні умови взагалі не працюють таким чином, тому ітерації Ньютона часто постійні.


8

Кожен раз, коли намагаються паралелізувати програму, вам доведеться збалансувати ряд витрат, але в першу чергу це є

  • Вартість виконання кожного обчислення
  • Вартість будь-яких комунікацій між цими розрахунками
  • Вартість управління цими обчисленнями

Якщо ваші обчислення незручно паралельні, вартість комунікацій буде дуже низькою (лише введення та виведення), а вартість управління повинна бути дуже низькою.

Якщо у вас є взаємозалежності між обчисленнями, вартість зв'язку може значно зрости. Якщо у вас складний алгоритм, який потребує різного часу для завершення будь-якого обчислення, тоді складність управління зростає, оскільки ви намагаєтесь ефективно використовувати наявні ресурси.

Як і у будь-якій формі оптимізації, ключовим є тестування. Подивіться, як він працює без MPI, як він працює з MPI та одним процесом, а потім подивіться, як він масштабується.

Якщо ви граєте з CUDA, спробуйте дати їй набагато більше даних. Один тест тут призвів до негативного прискорення. Ми надали йому в 1000 разів більше даних, і версія GP-GPU закінчилася майже в той же час, тоді як версія, що працює на основному процесорі, зайняла в 1000 разів більше.


3

Я рекомендую вам зробити наступне:

  • Складіть профіль часу виконання коду з паралелізацією та без неї. Якщо у вас є сумніви щодо того, як це зробити, ми можемо допомогти вам, якщо ви краще опишете свій код.

  • Тепер ви можете зосередитись на частинах, які працюють повільніше паралельно. Ви повинні знати, що зв’язок між процесами може бути повільним. Як зазначали Марк і Шон, те, що проблему можна розділити на нитки, не означає, що це буде ефективно. Ви повинні заглянути в це глибше. Але якщо ви профіліруєте свій код, він може допомогти вам знайти будь-які наявні помилки. Мої два центи.

Якщо ви поясните, що ви робите, більш докладно, наприклад, з робочим процесом, хтось, можливо, зможе дати вам краще пояснення.


@ketch: ти маєш рацію. Вибачте і дякую за те, що помітили. Відредагував текст.
jbcolmenares
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.