Есть ли способ заставить определенный поток ждать других потоков при каких-то условиях в ядре OpenCL - PullRequest
0 голосов
/ 13 марта 2012

    __kernel
    void example(__global int *a, __global int *dependency, uint cols)
    {
        int j = genter code hereet_global_id(0);
        int i = get_global_id(1);
        if(i > 0 && j > 0)
        {
            while(1) 
        {
           test = 1;                
            }
            //Wait for the dependents

        -----------------------------

        --------------------------
        }
    }

В приведенном выше коде ядра, почему цикл while просто пропускается во всех потоках без бесконечного цикла.Любые идеи по этому поводу.Я работаю над некоторой интересной проблемой, которая требует, чтобы поток ожидал завершения некоторых других потоков на основе некоторых критериев, но каждый раз, когда выше или во время (wait_condition) пропускается, когда он запускается на GPU.

Есть ли другой способ заставить конкретный поток ждать других потоков в ядре OpenCL на GPU?

Заранее спасибо!

1 Ответ

3 голосов
/ 14 марта 2012

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

Ваш код иллюстрирует задачу параллельной задачи. Итак, мой вопрос высокого уровня: какую проблему вы решаете? Если это параллельная задача, то, возможно, графический процессор не лучшее решение. Будет ли многоядерный процессор альтернативой?

Ваш код является типичным для «спин-блокировки». Где код повторяется, пока значение не изменится. Его часто используют для кратковременного легкого блокирования в базах данных. Это опасный код даже на процессоре, поскольку ошибка или ошибка может заблокировать процессор или графический процессор. Для кода ЦП спин-блокировка обычно защищена таймером прерывания. Использование

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...