Recientemente abordé este problema utilizando algunas de estas respuestas como punto de partida. Lo más útil a tener en cuenta es que los boids son una especie de simulación simple de n cuerpos: cada boid es una partícula que ejerce una fuerza sobre sus vecinos.
Encontré el papel de Linde difícil de leer; Sugiero en cambio mirar a SJ Plimpton "Algoritmos paralelos rápidos de para la dinámica molecular de corto alcance" , a los que Linde hizo referencia. El artículo de Plimpton es mucho más legible y detallado con mejores cifras:
En pocas palabras, los métodos de descomposición atómica asignan un subconjunto de átomos de forma permanente a cada procesador, los métodos de descomposición forzada asignan un subconjunto de cálculos de fuerza por pares a cada proceso, y los métodos de descomposición espacial asignan una subregión del cuadro de simulación a cada proceso .
Te recomiendo que pruebes AD. Es lo más fácil de entender e implementar. FD es muy similar. aquí está la simulación de n-cuerpos de nVidia con CUDA usando FD, que debería darle una idea aproximada de cómo el mosaico y la reducción pueden ayudar a superar drásticamente el rendimiento en serie.
Las implementaciones de SD generalmente son técnicas de optimización y requieren cierto grado de coreografía para implementarse. Casi siempre son más rápidos y escalan mejor.
Esto se debe a que AD / FD requiere la creación de una "lista de vecinos" para cada boid. Si cada boid necesita conocer la posición de sus vecinos, la comunicación entre ellos es O ( n ²). Puede usar las listas de vecinos de Verlet para reducir el tamaño del área que comprueba cada boid, lo que le permite reconstruir la lista cada pocos pasos en lugar de cada paso, pero sigue siendo O ( n ²). En SD, cada celda mantiene una lista de vecinos, mientras que en AD / FD cada boid tiene una lista de vecinos. Entonces, en lugar de que cada boid se comunique entre sí, cada célula se comunica entre sí. Esa reducción en la comunicación es de donde viene el aumento de velocidad.
Lamentablemente, el problema de Boids sabotea ligeramente SD. Hacer que cada procesador realice un seguimiento de una celda es más ventajoso cuando los boids están distribuidos de manera uniforme en toda la región. ¡Pero quieres que las boids se agrupen! Si su bandada se comporta correctamente, la gran mayoría de sus procesadores se irán, intercambiando listas vacías entre sí, y un pequeño grupo de celdas terminará realizando los mismos cálculos que AD o FD.
Para lidiar con esto, puede ajustar matemáticamente el tamaño de las celdas (que es constante) para minimizar el número de celdas vacías en un momento dado, o usar el algoritmo Barnes-Hut para árboles cuádruples. El algoritmo BH es increíblemente poderoso. Paradójicamente, es extremadamente difícil de implementar en arquitecturas paralelas. Esto se debe a que un árbol BH es irregular, por lo que los hilos paralelos lo atravesarán a velocidades muy variables, lo que provocará una divergencia del hilo. Salmon y Dubinski han presentado algoritmos de bisección recursiva ortogonal para distribuir los cuadrúteros de manera uniforme entre los procesadores, que deben reestablecerse iterativamente para la mayoría de las arquitecturas paralelas.
Como puede ver, estamos claramente en el ámbito de la optimización y la magia negra en este momento. Nuevamente, intente leer el artículo de Plimpton y vea si tiene algún sentido.