На высоком уровне, графические процессоры являются устройствами параллельного вычисления данных. Им нравится запускать одну и ту же задачу на разных данных. Они не преуспевают, когда их задачи делают разные вещи.
Ваш код иллюстрирует задачу параллельной задачи. Итак, мой вопрос высокого уровня: какую проблему вы решаете? Если это параллельная задача, то, возможно, графический процессор не лучшее решение. Будет ли многоядерный процессор альтернативой?
Ваш код является типичным для «спин-блокировки». Где код повторяется, пока значение не изменится. Его часто используют для кратковременного легкого блокирования в базах данных. Это опасный код даже на процессоре, поскольку ошибка или ошибка может заблокировать процессор или графический процессор. Для кода ЦП спин-блокировка обычно защищена таймером прерывания.
Использование
1) установить таймер
2) вращаться, пока значение не изменится
3) продолжить или перевести
Таким образом, после необходимого числа мс код прерывается и выдается ошибка. Поэтому, если вы используете шаблон спин-блокировки, для безопасности добавьте выход цикла в оператор while после того, как будет выполнено подходящее число циклов.
В алгоритмах сокращения OpenCL, это типично для нулевого потока (get_global_id (0) == 0)
чтобы вернуть окончательный результат одиночного. До этого все потоки были синхронизированы с помощью барьерного вызова
__kernel
void mytask( ... , global float * result )
{
int thread = get_global_id(0);
... your code
barrier( CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE ) // flush global and local variables or enqueue a memory fence see OpenCL spec for details
if ( thread == 0) // Zero thread
result[0] = value; // set the singleton result as the zeroth array element
}