Как запустить другой поток из кода OpenCL?

Мой алгоритм состоит из двух шагов:

  1. Генерация данных. На этом шаге я генерирую массив данных в цикле как результат некоторой функции
  2. Обработка данных. Для этого шага я написал ядро ​​OpenCL, которое обрабатывает массив данных, сгенерированный на предыдущем шаге.

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

Могу ли я запустить другое ядро ​​​​opencl из текущего ядра в отдельном потоке? Или он будет запущен в каком-то потоке, вызывающем ядро?

Некоторый псевдокод для иллюстрации моей точки зрения:

__kernel second(__global int * data, int index) {
    //work on data[i]. This process takes a lot of time
}

__kernel first(__global int * data, const int length) {
    for (int i = 0; i < length; i++) {
        // generate data and store it in data[i]

        // This kernel will be launched in some thread that caller or in new thread?
        // If in same thread, there are ways to launch it in separated thread?
        second(data, i);
    }
}

person Eugene Burtsev    schedule 15.03.2011    source источник


Ответы (3)


Нет, в OpenCL нет концепции потоков, и выполнение ядра не может запустить другое ядро. Все выполнение ядра запускается ЦП.

person Dr. Snoopy    schedule 15.03.2011
comment
@Eugene Обходной путь? Запишите данные в глобальную память и когда все данные будут записаны, запустите ядро, которое обрабатывает данные. - person Dr. Snoopy; 16.03.2011
comment
Спасибо вам, но теперь моя программа работает так, как вы говорите. Я хотел повысить производительность таким образом :-) - person Eugene Burtsev; 16.03.2011

Вы должны запустить одно ядро. Затем выполните clFInish(); Затем выполните следующее ядро.

Есть более эффективные способы, но я буду путать вас только с событиями.

Вы просто используете вывод памяти первого ядра в качестве ввода для второго. При этом вы избегаете процесса копирования CPU->GPU.

person DarkZeros    schedule 25.05.2011

Я считаю, что глобальный размер работы можно рассматривать как количество потоков, которые будут выполняться тем или иным образом. Поправьте меня если я ошибаюсь.

person peter    schedule 16.03.2011