Добавить результат OpenCL в список / Уменьшить пространство решения
У меня есть ядро OpenCL с несколькими рабочими элементами. Предположим для обсуждения, что у меня есть двумерное рабочее пространство с элементами x*y, работающими с массивом входных элементов одинакового размера, но с небольшим количеством элементов. Лишь немногие из этих элементов ввода дают результат, который я хочу сохранить, большинство - нет. Я хочу поставить в очередь другое ядро, которое принимает только сохраненные результаты в качестве входных данных.
Возможно ли в OpenCL добавить результаты в какой-то список, чтобы передать их в качестве входных данных другому Ядру, или есть лучшая идея уменьшить объем пространства решения? Более того: это даже хороший вопрос, чтобы задавать его с учетом модели программирования OpenCL?
1 ответ
Что бы я сделал, если объем данных результатов составляет небольшой процент (то есть: 0-10%), это использование локальной атомики и глобальной атомики с глобальным счетчиком.
Интерфейс данных между ядром 1 <----> Ядро 2:
int counter //used by atomics to know where to write
data_type results[counter]; //used to store the results
Kernel1:
- Создайте функцию ядра, которая выполняет операцию с данными.
- Рабочие элементы, которые дают результат:
- Сохраните результат в локальной памяти и убедитесь, что не происходит гонок данных с использованием локальной атомики в локальном счетчике.
- Используйте рабочий элемент 0, чтобы сохранить все локальные результаты обратно в глобальную память, используя глобальную атомику.
Kernel2:
- Рабочие элементы ниже "счетчика" работают, остальные просто возвращаются.