Синхронизация OpenCL между рабочими группами - PullRequest
9 голосов
/ 05 мая 2011

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

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

Ответы [ 2 ]

8 голосов
/ 05 мая 2011

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

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

4 голосов
/ 05 мая 2011

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

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

...