Saya menangani masalah ini baru-baru ini menggunakan beberapa jawaban ini sebagai titik awal. Hal yang paling membantu untuk diingat adalah bahwa boids adalah semacam simulasi n-body sederhana: setiap boid adalah partikel yang mengerahkan kekuatan pada tetangganya.
Saya menemukan kertas Linde sulit dibaca; Sebagai gantinya, saya menyarankan untuk melihat "Algoritma Paralel Cepat SJ Plimpton untuk Dinamika Molekul Jangka Pendek" , yang dirujuk Linde. Makalah Plimpton jauh lebih mudah dibaca dan terperinci dengan angka-angka yang lebih baik:
Singkatnya, metode dekomposisi atom menetapkan subset atom secara permanen untuk setiap prosesor, metode dekomposisi gaya menetapkan subset perhitungan gaya berpasangan untuk setiap proc, dan metode dekomposisi spasial menetapkan sub-wilayah kotak simulasi untuk setiap proc .
Saya sarankan Anda mencoba AD. Ini yang paling mudah dipahami dan diimplementasikan. FD sangat mirip. Berikut ini adalah simulasi n-body nVidia dengan CUDA menggunakan FD, yang seharusnya memberi Anda gambaran kasar tentang bagaimana ubin dan reduksi dapat membantu secara drastis melampaui kinerja serial.
Implementasi SD pada umumnya adalah teknik optimalisasi, dan memerlukan beberapa tingkat koreografi untuk diimplementasikan. Mereka hampir selalu lebih cepat dan skalanya lebih baik.
Ini karena AD / FD membutuhkan pembuatan "daftar tetangga" untuk setiap boid. Jika setiap kebutuhan boid untuk mengetahui posisi dari tetangganya, komunikasi antara mereka adalah O ( n ²). Anda dapat menggunakan daftar tetangga Verlet untuk mengurangi ukuran area setiap pemeriksaan boid, yang memungkinkan Anda untuk membangun kembali daftar setiap beberapa langkah waktu alih-alih setiap langkah, tetapi masih O ( n ²). Di SD, setiap sel menyimpan daftar tetangga, sedangkan dalam AD / FD setiap boid memiliki daftar tetangga. Jadi alih-alih setiap boid berkomunikasi satu sama lain, setiap sel berkomunikasi satu sama lain. Pengurangan dalam komunikasi adalah dari mana peningkatan kecepatan berasal.
Sayangnya masalah boid menyabotase SD sedikit. Memiliki masing-masing prosesor melacak sel yang paling menguntungkan ketika boids agak merata di seluruh wilayah. Tapi Anda ingin boids berkumpul bersama! Jika kawanan Anda berperilaku baik, sebagian besar prosesor Anda akan berdetak, bertukar daftar kosong satu sama lain, dan sekelompok kecil sel pada akhirnya akan melakukan perhitungan yang sama seperti yang akan dilakukan oleh AD atau FD.
Untuk mengatasinya, Anda bisa menyetel ukuran sel secara matematis (yang konstan) untuk meminimalkan jumlah sel kosong pada waktu tertentu, atau menggunakan algoritma Barnes-Hut untuk quad-tree. Algoritma BH sangat kuat. Paradoksnya, sangat sulit untuk diterapkan pada arsitektur paralel. Ini karena pohon BH tidak beraturan, sehingga benang paralel akan melewatinya dengan kecepatan yang sangat bervariasi, menghasilkan perbedaan benang. Salmon dan Dubinski telah menyajikan algoritme pengabdian rekursif ortogonal untuk mendistribusikan quadtree secara merata di antara prosesor, yang harus disajikan kembali secara iteratif untuk sebagian besar arsitektur paralel.
Seperti yang Anda lihat, kita jelas berada di bidang optimisasi dan ilmu hitam pada saat ini. Sekali lagi, cobalah membaca makalah Plimpton dan lihat apakah itu masuk akal.