Как запустить другой поток из кода OpenCL? - PullRequest
1 голос
/ 15 марта 2011

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

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

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

Можно ли запустить другое ядро ​​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);
    }
}

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

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

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

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

3 голосов
/ 15 марта 2011

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

0 голосов
/ 16 марта 2011

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

...