2015-05-13 3 views
1

Как известно, функция OpenCLбарьер() работает только для одной рабочей группы, и нет прямой возможности синхронизации рабочих групп. Если возможно, что сегодня лучший подход к глобальной синхронизации? Использование атоматики, функции OpenCL 2.0 и т. Д.?Возможна ли глобальная синхронизация в OpenCL?

Ссылки Github, примеры приветствуются!

Thankx!

+2

В общем случае, это не представляется возможным. –

+0

Как указано выше: это невозможно. Вы всегда можете найти проблемы, чтобы вписаться в одну рабочую группу и иметь хотя бы локальную синхронизацию. Но, конечно, если размер проблемы будет расширяться, это больше не будет работать. И он не будет работать на разных аппаратных средствах без корректировки размера вашей проблемы. OpenCL 2.0 предлагает функцию вызова в очередь ядра. Это может снизить некоторые накладные расходы, если вам нужна синхронизация на основе хоста. Но это не общее решение всех проблем. – Christian

+0

Вы можете попытаться разделить вашу программу на большее количество ядер и синхронизировать ее с помощью командной очереди. Это особенно эффективно, когда вам не нужно запоминать переменные внутри ядра, и вы можете их вычислить. Если вам нужно хранить переменные, вы можете использовать глобальные массивы структур/векторов для переноса переменных между ядрами. –

ответ

3

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

Разделите ядро ​​на два параметра - например, на kernelA и kernelB. Глобальная синхронизация - это просто вопрос запуска NDRange для ядра A, затем finish() и NDRange для kernelB. Глобальные данные будут оставаться в памяти между двумя вызовами.

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

1

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

См. Статью Xiao et al., Которая оценивает блокировку и блокировку подходов к глобальной синхронизации на графических процессорах. http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf

Это упоминается в другом StackOverflow пост находится здесь: OpenCL and GPU global synchronization

Смежные вопросы