OpenCL - Sincronización de búfer de GPU múltiple

Tengo un kernel OpenCL que calcula la fuerza total sobre una partícula ejercida por otras partículas en el sistema, y ​​luego otra que integra la posición / velocidad de la partícula. Me gustaría paralelizar estos núcleos a través de múltiples GPU, básicamente asignando cierta cantidad de partículas a cada GPU. Sin embargo, tengo que ejecutar este kernel varias veces, y el resultado de cada GPU se usa en todos los demás. Déjame explicarte un poco más:

Supongamos que tiene la partícula 0 en la GPU 0 y la partícula 1 en la GPU 1. La fuerza en la partícula 0 cambia, al igual que la fuerza en la partícula 1, y luego el integrador cambia sus posiciones y velocidades en consecuencia. Luego, estas nuevas posiciones deben colocarse en cada GPU (ambas GPU necesitan saber dónde se encuentran tanto la partícula 0 como la partícula 1) y estas nuevas posiciones se usan para calcular las fuerzas sobre cada partícula en el siguiente paso, que es usado por Integrador, cuyos resultados se utilizan para calcular fuerzas, etc., etc.Esencialmente, todos los buffers deben contener la misma información en el momento en que los cálculos de forzados vuelvan.

Entonces, la pregunta es:¿Cuál es la mejor manera de sincronizar los buffers en las GPU, dado que cada GPU tiene un buffer diferente?? No pueden tener un solo búfer compartido si quiero mantener el paralelismo,según mi última pregunta (sin embargo, si hay una forma de crear un búfer compartido y aún mantener varias GPU, estoy a favor de eso). Sospecho que copiar los resultados en cada paso causará más desaceleración de lo que vale la pena paralelizar el algoritmo en las GPU.

Encontréeste hilo, pero la respuesta no fue muy definitiva y se aplicó solo a un único búfer en todas las GPU. Me gustaría saber, específicamente, para las GPU Nvidia (más específicamente, el Tesla M2090).

EDITAR: En realidad, segúnEste hilo en los foros de Khronos., un representante del grupo de trabajo OpenCL dice que un solo búfer en un contexto compartido se propaga en varias GPU, y cada una se asegura de que tenga la información más reciente en la memoria. Sin embargo, no estoy viendo ese comportamiento en las GPU de Nvidia; cuando usowatch -n .5 nvidia-smi mientras mi programa se ejecuta en segundo plano, veo que el uso de la memoria de una GPU aumenta durante un tiempo y luego disminuye mientras que el uso de la memoria de otra GPU aumenta. ¿Hay alguien por ahí que me pueda orientar en la dirección correcta con esto? Tal vez es solo su implementación?

Respuestas a la pregunta(1)

Su respuesta a la pregunta