Добавить результат 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:

  • Рабочие элементы ниже "счетчика" работают, остальные просто возвращаются.
Другие вопросы по тегам