Ну, есть способ, через некоторые взломы. Я разветвил pyopencl.algorithm и создал новый метод sparse_copy_if () , который возвращает нужный мне буфер нужного размера, , как если бы это был список с элементами, добавляемыми к . Я задокументирую это и отправлю патч Андреасу.
Однако, если ваши буферы слишком велики, есть способ еще больше повысить производительность: я следовал предложению Рик выше, создал хеш-таблицу и добавил туда нужные результаты. (Обратите внимание, что всегда существует риск столкновения, поэтому буфер / массив хеш-таблицы должен быть на несколько порядков больше ожидаемого результата).
Затем я запускаю sparse_copy_if () в буфере хеш-таблицы и получаю только буфер идеального размера.
В заключение:
У меня есть ядро, сканирующее буфер размером 1 000 000. Он вычисляет результаты для всех из них, но не разделяет результаты, которые я хочу.
Эти желаемые результаты затем помещаются в буфер размером ~ 25 000 (хеш-таблица, значительно меньше исходных данных).
Затем, запустив sparse_copy_if () в буфере хеш-таблицы, вы получите желаемый результат - почти как если бы это был список, в который можно было бы добавить элементы.
sparse_copy_if (), конечно, имеет накладные расходы на создание буферов идеального размера и копирование в них данных. Но я обнаружил, что эти издержки обычно компенсируют, поскольку вы сейчас (с малой задержкой) передаете небольшие буферы / массивы с устройства обратно на хост.
Код для тестирования производительности sparse_copy_if () и copy_if ().