Синхронизация OpenCL между рабочими группами

можно ли синхронизировать рабочие группы OpenCL?

например, у меня есть 100 рабочих групп каждая рабочая группа имеет только один элемент (не спрашивайте меня, почему, это пример), и мне нужно поставить барьер для каждого рабочего элемента, который гарантирует, что все рабочие группы будут продолжаться после того, как каждый рабочий элемент в этих 100 рабочих группах достигнет этой точки барьера.

2 ответов


Нет, ты не можешь. Потоки внутри группы можно синхронизировать, а выполнение ядра-внутри очереди команд.

вы можете синхронизировать небольшое количество групп, если все они выполняются одновременно, используя атомарный доступ. Но он замерзнет, если некоторые группы запланированы позже, и у вас нет контроля над этим.


одним словом, нет, вы не можете. Парадигма OpenCL является параллельной данным, где рабочие группы должны быть независимыми. Единственный механизм синхронизации области рабочей группы находится на уровне очереди команд, т. е. отдельные запуски ядра. Если алгоритм не может приспособить это, вам либо нужен новый алгоритм, либо используйте другую модель программирования.

вы должны иметь в виду, что часто существует гораздо больше рабочих групп, чем аппаратных средств для их одновременного выполнения. Синхронизация в такие случаи невозможны. Существуют способы реализации spinlock или критического раздела через аппаратно-зависимое число рабочих групп с использованием примитивов доступа к атомной памяти, однако они действительно являются злоупотреблением моделью программирования и, как правило, полезны только там, где существует относительно небольшое взаимодействие между рабочими группами.