Нещодавно я вирішив цю проблему, використовуючи деякі з цих відповідей як вихідну точку. Найкорисніше, що потрібно пам’ятати, - це те, що боїди - це щось просте моделювання n-тіла: кожен боїд - це частинка, яка чинить силу на своїх сусідів.
Мені було важко читати папір Лінде; Я пропоную замість цього переглянути "Швидкі паралельні алгоритми для молекулярної динаміки короткого діапазону" SJ Plimpton , на які посилався Лінде. Папір Плімптона набагато легше читати і деталізувати з кращими цифрами:
У двох словах, способи декомпозиції атомів присвоюють підмножину атомів постійно кожному процесору, методи декомпозиції присвоюють підмножину обчислень подвійних силових обчислень кожному методу, а просторові методи декомпозиції присвоюють підрегіон вікна імітації кожному проц. .
Я рекомендую спробувати AD. Це найпростіше зрозуміти та реалізувати. FD дуже схожий. Ось моделювання nVidia n-body з CUDA за допомогою FD, яке повинно дати вам приблизне уявлення про те, як плитка та скорочення можуть допомогти кардинально перевершити серійні показники.
Реалізація SD, як правило, є оптимізаційними методами і вимагає певної міри хореографії для їх здійснення. Вони майже завжди швидші і краще масштабуються.
Це пояснюється тим, що AD / FD вимагає складання "сусідського списку" для кожного boid. Якщо кожен боїд повинен знати положення своїх сусідів, зв'язок між ними - O ( n ²). Ви можете використовувати списки сусідів Verlet, щоб зменшити розмір області, яку перевіряє кожен boid, що дозволяє переробляти список кожні кілька кроків часу замість кожного кроку, але це все одно O ( n ²). У SD кожна комірка зберігає список сусідів, тоді як в AD / FD кожен боїд має список сусідів. Отже, замість того, щоб кожен боїд спілкувався один з одним, кожна клітина спілкувалася між собою. Це зниження комунікацій - це те, звідки відбувається збільшення швидкості.
На жаль, проблеми з саботажем SD незначно. Наявність у кожного процесора відстеження комірки є найбільш вигідним, коли боїди дещо рівномірно розподілені по всій області. Але ви хочете, щоб боїди збиралися разом! Якщо ваша зграя поводиться належним чином, переважна більшість ваших процесорів буде відмічати, обмінюючись порожніми списками один з одним, і невелика група комірок в кінцевому підсумку виконає ті самі розрахунки, що і AD або FD.
Щоб вирішити це, ви можете або математично налаштувати розмір комірок (який є постійним), щоб мінімізувати кількість порожніх комірок у будь-який момент часу, або використовувати алгоритм Барнса-Хата для чотирьох дерев. Алгоритм BH надзвичайно потужний. Як не парадоксально, але це надзвичайно важко реалізувати на паралельних архітектурах. Це тому, що дерево БХ нерегулярне, тому паралельні нитки будуть проходити по ньому з дивовижною різною швидкістю, що призводить до розбіжності ниток. Лосось та Дубінський представили ортогональні рекурсивні алгоритми поділу для рівномірного розподілу кватрелів серед процесорів, які повинні бути повторно перетворені для більшості паралельних архітектур.
Як бачимо, ми зараз чітко в області оптимізації та чорної магії. Знову ж таки спробуйте прочитати папір Плімптона і побачити, чи має це сенс.