Lidei com esse problema recentemente usando algumas dessas respostas como ponto de partida. A coisa mais útil a ter em mente é que os boids são uma espécie de simulação simples do corpo n: cada boid é uma partícula que exerce força sobre seus vizinhos.
Achei o jornal Linde difícil de ler; Sugiro, em vez disso, olhar para os "Algoritmos rápidos paralelos de SJ Plimpton para dinâmica molecular de curto alcance" , que Linde referenciou. O artigo de Plimpton é muito mais legível e detalhado com melhores números:
Em poucas palavras, os métodos de decomposição de átomos atribuem um subconjunto de átomos permanentemente a cada processador, os métodos de decomposição de força atribuem um subconjunto de cálculos de força em pares a cada proc e os métodos de decomposição espacial atribuem uma sub-região da caixa de simulação a cada proc .
Eu recomendo que você tente o AD. É o mais fácil de entender e implementar. FD é muito semelhante. Aqui está a simulação de corpo n da nVidia com CUDA usando FD, que deve fornecer uma idéia aproximada de como a telha e a redução podem ajudar a superar drasticamente o desempenho em série.
As implementações de SD geralmente são técnicas de otimização e requerem algum grau de coreografia para serem implementadas. Eles são quase sempre mais rápidos e escalam melhor.
Isso ocorre porque o AD / FD requer a criação de uma "lista de vizinhos" para cada boid. Se todo boid precisa conhecer a posição de seus vizinhos, a comunicação entre eles é O ( n ²). Você pode usar as listas de vizinhos do Verlet para reduzir o tamanho da área que cada boid verifica, o que permite reconstruir a lista a cada poucos intervalos de tempo em vez de cada etapa, mas ainda é O ( n ²). No SD, cada célula mantém uma lista de vizinhos, enquanto no AD / FD todo boid possui uma lista de vizinhos. Então, em vez de todo boid se comunicar, cada célula se comunica. Essa redução na comunicação é a origem do aumento da velocidade.
Infelizmente, o problema dos boids sabota ligeiramente o SD. Ter cada processador monitorando uma célula é mais vantajoso quando os boids são distribuídos de maneira uniforme por toda a região. Mas você quer que os boids se agrupem! Se seu rebanho estiver se comportando adequadamente, a grande maioria dos seus processadores estará passando, trocando listas vazias entre si e um pequeno grupo de células acabará realizando os mesmos cálculos que o AD ou o FD faria.
Para lidar com isso, você pode ajustar matematicamente o tamanho das células (que é constante) para minimizar o número de células vazias em um determinado momento ou usar o algoritmo Barnes-Hut para árvores quad. O algoritmo BH é incrivelmente poderoso. Paradoxalmente, é extremamente difícil de implementar em arquiteturas paralelas. Isso ocorre porque uma árvore BH é irregular, portanto, os threads paralelos o atravessam em velocidades muito variadas, resultando em divergência de thread. Salmon e Dubinski apresentaram algoritmos ortogonais de bissecção recursiva para distribuir quadríceps uniformemente entre processadores, que devem ser atualizados iterativamente para a maioria das arquiteturas paralelas.
Como você pode ver, estamos claramente no campo da otimização e da magia negra neste momento. Mais uma vez, tente ler o artigo de Plimpton e veja se isso faz algum sentido.