OpenCL - синхронизация нескольких буферов графического процессора

У меня есть ядро OpenCL, которое вычисляет общую силу на частицу, которую оказывают другие частицы в системе, а затем еще одно, которое объединяет положение / скорость частицы. Я хотел бы распараллелить эти ядра между несколькими графическими процессорами, в основном назначив некоторое количество частиц каждому графическому процессору. Однако мне приходится запускать это ядро несколько раз, и результаты каждого графического процессора используются на каждом другом. Позвольте мне объяснить это немного дальше:

Скажем, у вас есть частица 0 в GPU 0 и частица 1 в GPU 1. Сила на частицу 0 изменяется, как и сила на частице 1, а затем их положения и скорости изменяются интегратором соответственно. Затем эти новые позиции должны быть размещены на каждом GPU (оба GPU должны знать, где находятся и частица 0, и частица 1), и эти новые позиции используются для расчета сил на каждую частицу на следующем шаге, который используется интегратор, результаты которого используются для расчета сил и т. д. и т. д.Essentially, all the buffers need to contain the same information by the time the force calculations roll around.

Итак, вопрос в следующем:What is the best way to synchronize buffers across GPUs, given that each GPU has a different buffer? Они не могут иметь один общий буфер, если я хочу сохранить параллелизм,согласно моему последнему вопросу (хотя, если есть способ создать общий буфер и при этом сохранить несколько графических процессоров, я все для этого). Я подозреваю, что копирование результатов на каждом этапе приведет к большему замедлению, чем стоит распараллеливать алгоритм на разных графических процессорах.

Я нашелэта тема, но ответ не был окончательным и применялся только к одному буферу для всех графических процессоров. Я хотел бы знать, в частности, для графических процессоров Nvidia (точнее, Tesla M2090).

EDIT: На самом деле, согласноэта тема на форумах KhronosПредставитель рабочей группы OpenCL говорит, что один буфер в общем контексте действительно распределяется по нескольким графическим процессорам, и каждый из них следит за тем, чтобы в памяти была самая свежая информация. Однако я не вижу такого поведения на графических процессорах Nvidia; когда я используюwatch -n .5 nvidia-smi в то время как моя программа работает в фоновом режиме, я вижу, что использование памяти одним графическим процессором некоторое время увеличивается, а затем снижается, в то время как использование памяти другого графического процессора увеличивается. Есть ли кто-нибудь, кто может указать мне правильное направление с этим? Может быть, это просто их реализация?

Ответы на вопрос(1)

Ваш ответ на вопрос