최근에 이러한 답변 중 일부를 출발점으로 사용 하여이 문제를 해결했습니다. 가장 도움이되는 것은 보이드가 일종의 간단한 n- 바디 시뮬레이션이라는 것입니다. 각 보이드는 이웃에 힘을 가하는 입자입니다.
Linde 논문을 읽기가 어렵다는 것을 알았습니다. 대신 SJ Plimpton의 "단거리 분자 역학을위한 빠른 병렬 알고리즘"을 살펴 보는 것이 좋습니다. Linde가 언급 한 . Plimpton의 논문은 더 나은 수치로 훨씬 더 읽기 쉽고 상세합니다.
요컨대, 원자 분해 방법은 원자의 하위 집합을 각 프로세서에 영구적으로 할당하고, 힘 분해 방법은 쌍 단위 힘 계산의 하위 집합을 각 proc에 할당하고 공간 분해 방법은 시뮬레이션 상자의 하위 영역을 각 proc에 할당합니다. .
AD를 사용해 보는 것이 좋습니다. 이해하고 구현하는 것이 가장 쉽습니다. FD는 매우 유사합니다. 여기 당신에게 기와 및 감소를 크게 일련의 성능을 능가 할 수있는 방법의 거친 아이디어를 줄 것이다 FD를 사용하여 CUDA와 NVIDIA의 N 바디 시뮬레이션이다.
SD 구현은 일반적으로 최적화 기술이며 구현하려면 어느 정도의 안무가 필요합니다. 거의 항상 빠르며 확장 성이 좋습니다.
AD / FD는 각 보이드마다 "이웃 목록"을 작성해야하기 때문입니다. 모든 boid 필요가 이웃의 위치를 알고 있다면, 그들 사이의 통신은 O입니다 ( N ²). Verlet 네이버 목록을 사용하여 각 보이드가 확인하는 영역의 크기를 줄일 수 있습니다. 이렇게하면 모든 단계 대신 몇 단계마다 목록을 다시 작성할 수 있지만 여전히 O ( n ²)입니다. SD에서, 각 셀은 이웃리스트를 유지하는 반면, AD / FD에서 모든 보이드는 이웃리스트를 갖는다. 따라서 모든 보이드가 서로 통신하는 대신 모든 셀이 서로 통신합니다. 의사 소통의 감소는 속도 증가의 시작입니다.
불행하게도 boids 문제는 SD를 약간 방해합니다. 각 프로세서가 셀을 추적하도록하는 것이 보이드가 전체 영역에 걸쳐 고르게 분포 될 때 가장 유리합니다. 그러나 당신 은 보이드가 함께 모여 있기 를 원합니다 ! 무리가 제대로 작동하면 대부분의 프로세서가 빈 목록을 서로 교환하면서 똑딱 거리며 작은 셀 그룹이 AD 또는 FD와 동일한 계산을 수행하게됩니다.
이를 처리하기 위해 주어진 시간에 빈 셀 수를 최소화하기 위해 셀 크기 (상수)를 수학적으로 조정하거나 쿼드 트리에 Barnes-Hut 알고리즘을 사용할 수 있습니다. BH 알고리즘은 매우 강력합니다. 역설적으로 병렬 아키텍처에서는 구현하기가 매우 어렵습니다. 이는 BH 트리가 불규칙하기 때문에 병렬 스레드가 엄청나게 다양한 속도로 스레드를 가로 질러 스레드 분기를 발생시킵니다. Salmon과 Dubinski는 프로세서간에 쿼드 트리를 균등하게 분배하기 위해 직교 재귀 이분법 알고리즘을 제시했으며, 대부분의 병렬 아키텍처에 대해 반복적으로 복원해야합니다.
보시다시피, 우리는 현재 최적화와 흑 마법의 영역에 있습니다. 다시 Plimpton의 논문을 읽어보고 의미가 있는지 확인하십시오.