@ Привет всем,OpenCL, выполнение Синхронизация WorkItems в рабочей группе (не барьеров и обращение к памяти)
Я реализует цифровой фильтр на AMD GPU с помощью OpenCL. Функция фильтра - это зависимости между соседними элементами. Каждый элемент зависит от элементов слева, сверху и сверху справа. См. LINK с изображением, чтобы получить его лучше.
Такие,
element 2 -> from 1.
element 3 -> from 2.
element 7 -> from 1, 2 (top, top-right).
element 8 -> from 7, 2, 3.
element 16 -> from 15, 10, 11
etc... applying for each element from 2nd to 24th
Всего в нескольких подряд может выполняться параллельно, если выше строка идти вперед на 2-х элементов.
Итак, я пришел к вопросу, как организовать синхронизацию между элементами ??? Я не нашел способов организовать синхронизацию внутри рабочей группы. Барьеры, кажется, не являются подходящим механизмом, поскольку они предназначены для одновременного хранения контрольных точек архивирования, в то время как в моем случае это должна быть синхронизация с задержкой между потоками.
Существует один способ, который кажется подходящим. Использование clEnqueueTask() и событий (или clEnqueueNDRangeKernel с рабочей группой равно < 1, 1, 1>). Но в этом случае I не может использовать локальную память, и это будет значительно медленнее.
Вопрос еще раз: как организовать синхронизацию между потоками в одной рабочей группе для эффективного использования быстрой локальной памяти ???
Заранее спасибо.
Обратите внимание:
- размер 6x4 только для иллюстрации, действительно, это около 4K элементов.
- "element" - это блок 8x8 целых значений.
Спасибо за ваш ответ. Но снова ** BARRIERs **, как вы их предлагаете, это путь к ** ПОЛНОСТЬЮ ** сериализовать исполнение, пока я спрашиваю о синхронизации параллельных потоков. И да, массив 6x4 только для иллюстрации на самом деле это массив 2K x 2K ... – user3124812
На данный момент я не уверен, понял ли я ваш вопрос completeley. Барьеры, упомянутые в IMHO, связаны с синхронизацией параллельных потоков внутри рабочей группы, и вы можете использовать ее для синхронизации параллельных потоков. Я думал, что ваша цель - реализовать сериализованное исполнение, чтобы гарантировать, что все зависимости текущего элемента выполняются, когда дело доходит до его расчета. – kn0x
нет, вопрос в том, как организовать выполнение параллельно, разрешая некоторые зависимости. Сериализация не является проблемой. Пожалуйста, см. Комментарий ниже, я попытался объяснить это снова. Надеюсь, это немного ясно. – user3124812