Как получить список (или подмножество) из ядра OpenCL? - PullRequest
0 голосов
/ 23 июня 2011

У меня большой массив с 2 ^ 20 ulongs. Это маленькое ядро ​​OpenCL протекает через него как очарование. Тем не менее, я абсолютно не знаю (и Google не помог здесь), как вернуть небольшое количество элементов (2 ^ 10) из него.

Я ищу список фиксированного размера, содержащий не более 1024 элементов, у которых расстояние Хэмминга (поп-счет) меньше заданного числа. Порядок списка не имеет значения, поэтому, возможно, мне следует попросить подмножество этих 2 ** 20 пунктов.

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

Поскольку ожидается, что выходные данные будут намного меньше входных, использование глобального индекса в выходных данных с помощью атомарного доступа не будет слишком неэффективным. Вам нужно передать буфер, содержащий одну uint, изначально установленную в 0:

__kernel void K(...,__global uint * outIndex,...)
{
  ...
  if (selected)
  {
    uint index = atomic_inc(outIndex);  // or atom_inc if using OpenCL 1.0 extension
    out[index] = value;
  }
}
1 голос
/ 06 февраля 2015

Ну, есть способ, через некоторые взломы. Я разветвил pyopencl.algorithm и создал новый метод sparse_copy_if () , который возвращает нужный мне буфер нужного размера, , как если бы это был список с элементами, добавляемыми к . Я задокументирую это и отправлю патч Андреасу.

Однако, если ваши буферы слишком велики, есть способ еще больше повысить производительность: я следовал предложению Рик выше, создал хеш-таблицу и добавил туда нужные результаты. (Обратите внимание, что всегда существует риск столкновения, поэтому буфер / массив хеш-таблицы должен быть на несколько порядков больше ожидаемого результата).

Затем я запускаю sparse_copy_if () в буфере хеш-таблицы и получаю только буфер идеального размера.

В заключение:

У меня есть ядро, сканирующее буфер размером 1 000 000. Он вычисляет результаты для всех из них, но не разделяет результаты, которые я хочу.

Эти желаемые результаты затем помещаются в буфер размером ~ 25 000 (хеш-таблица, значительно меньше исходных данных).

Затем, запустив sparse_copy_if () в буфере хеш-таблицы, вы получите желаемый результат - почти как если бы это был список, в который можно было бы добавить элементы.

sparse_copy_if (), конечно, имеет накладные расходы на создание буферов идеального размера и копирование в них данных. Но я обнаружил, что эти издержки обычно компенсируют, поскольку вы сейчас (с малой задержкой) передаете небольшие буферы / массивы с устройства обратно на хост.

Код для тестирования производительности sparse_copy_if () и copy_if ().

1 голос
/ 23 июня 2011

Список как таковой не поддерживается в OpenCL.OpenCL - это разновидность стандарта C с некоторыми расширениями и некоторыми ограничениями.Вы можете работать только с буферами (иначе говоря, с массивами).

Вам может потребоваться глобальный буфер памяти, который вам нужно выделить перед тем, как запустить ядро.Здесь вы можете поместить свои результаты и с помощью clEnqueueReadBuffer вы можете получить свои результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...