Глобальная синхронизация внутри ядра невозможна. Это связано с тем, что рабочие группы не могут работать одновременно. Вы можете добиться своего рода глобальной синхронизации в хост-приложении, если вы разбиваете свое ядро на куски. Это не подходит для многих ядер, особенно если вы используете большую часть локальной памяти или имеете немного кода инициализации, прежде чем ваше ядро действительно будет работать.
Разделите ядро на два параметра - например, на kernelA и kernelB. Глобальная синхронизация - это просто вопрос запуска NDRange для ядра A, затем finish() и NDRange для kernelB. Глобальные данные будут оставаться в памяти между двумя вызовами.
Опять же, не очень и не обязательно высокая производительность, но если вы действительно должен иметь глобальную синхронизацию, это единственный способ получить его.
В общем случае, это не представляется возможным. –
Как указано выше: это невозможно. Вы всегда можете найти проблемы, чтобы вписаться в одну рабочую группу и иметь хотя бы локальную синхронизацию. Но, конечно, если размер проблемы будет расширяться, это больше не будет работать. И он не будет работать на разных аппаратных средствах без корректировки размера вашей проблемы. OpenCL 2.0 предлагает функцию вызова в очередь ядра. Это может снизить некоторые накладные расходы, если вам нужна синхронизация на основе хоста. Но это не общее решение всех проблем. – Christian
Вы можете попытаться разделить вашу программу на большее количество ядер и синхронизировать ее с помощью командной очереди. Это особенно эффективно, когда вам не нужно запоминать переменные внутри ядра, и вы можете их вычислить. Если вам нужно хранить переменные, вы можете использовать глобальные массивы структур/векторов для переноса переменных между ядрами. –