Tôi đã giải quyết vấn đề này gần đây bằng cách sử dụng một số câu trả lời này làm điểm bắt đầu. Điều hữu ích nhất cần ghi nhớ là boids là một loại mô phỏng cơ thể n đơn giản: mỗi boid là một hạt tác động một lực lên các nước láng giềng.
Tôi thấy giấy Linde khó đọc; Thay vào đó, tôi đề nghị xem xét "Thuật toán song song nhanh cho động lực phân tử tầm ngắn" của SJ Plimpton , mà Linde đã tham khảo. Bài viết của Plimpton dễ đọc và chi tiết hơn với các số liệu tốt hơn:
Tóm lại, các phương pháp phân rã nguyên tử gán một tập hợp con nguyên tử vĩnh viễn cho mỗi bộ xử lý, các phương pháp phân rã lực chỉ định một tập hợp các phép tính lực theo cặp cho mỗi Proc và các phương pháp phân rã không gian gán một vùng con của hộp mô phỏng cho mỗi Proc .
Tôi khuyên bạn nên thử AD. Đó là cách dễ nhất để hiểu và thực hiện. FD rất giống nhau. Dưới đây là mô phỏng cơ thể n của nVidia với CUDA bằng FD, sẽ cung cấp cho bạn một ý tưởng sơ bộ về cách ốp lát và giảm có thể giúp vượt qua hiệu suất nối tiếp mạnh mẽ.
Việc triển khai SD nói chung là tối ưu hóa các kỹ thuật và đòi hỏi một số mức độ vũ đạo để thực hiện. Chúng hầu như luôn luôn nhanh hơn và quy mô tốt hơn.
Điều này là do AD / FD yêu cầu xây dựng một "danh sách hàng xóm" cho mỗi boid. Nếu mọi boid cần biết vị trí của các nước láng giềng thì giao tiếp giữa họ là O ( n ²). Bạn có thể sử dụng danh sách hàng xóm Verlet để giảm kích thước của khu vực mỗi lần kiểm tra, cho phép bạn xây dựng lại danh sách sau mỗi vài dấu thời gian thay vì mỗi bước, nhưng vẫn là O ( n ²). Trong SD, mỗi ô giữ một danh sách lân cận, trong khi ở AD / FD, mọi ô đều có danh sách lân cận. Vì vậy, thay vì mỗi lần giao tiếp với nhau, mọi tế bào đều giao tiếp với nhau. Sự giảm tốc độ trong giao tiếp là nơi tăng tốc độ đến từ.
Thật không may, vấn đề boids phá hoại SD một chút. Có mỗi bộ xử lý theo dõi một tế bào là lợi thế nhất khi các lỗ được phân phối đều trên toàn bộ khu vực. Nhưng bạn muốn boids tụ lại với nhau! Nếu đàn của bạn hoạt động đúng, phần lớn các bộ xử lý của bạn sẽ bỏ đi, trao đổi danh sách trống với nhau và một nhóm nhỏ các tế bào sẽ kết thúc thực hiện các phép tính tương tự AD hoặc FD.
Để giải quyết vấn đề này, bạn có thể điều chỉnh một cách toán học kích thước của các ô (không đổi) để giảm thiểu số lượng ô trống tại bất kỳ thời điểm nào hoặc sử dụng thuật toán Barnes-Hut cho bốn cây. Thuật toán BH cực kỳ mạnh mẽ. Nghịch lý thay, nó cực kỳ khó thực hiện trên các kiến trúc song song. Điều này là do cây BH không đều, do đó các luồng song song sẽ đi qua nó với tốc độ khác nhau, dẫn đến sự phân kỳ của luồng. Salmon và Dubinski đã trình bày các thuật toán chia đệ quy trực giao để phân phối tứ giác đều giữa các bộ xử lý, chúng phải được lặp lại lặp đi lặp lại cho hầu hết các kiến trúc song song.
Như bạn có thể thấy, chúng ta rõ ràng đang ở trong lĩnh vực tối ưu hóa và ma thuật đen vào thời điểm này. Một lần nữa, hãy thử đọc bài viết của Plimpton và xem nó có ý nghĩa gì không.